高手帮看一下这个存储过程为什么没有结果集?

b249833177 2014-08-16 10:18:05
前提是数据库中有记录。
这是一个分页的存储过程。
问题1:传入符合条件的参数执行存储过程,为什么没有结果集返回?
问题2:传入排序表达式后,存储过程为什么会报错?报告无法将datetime类型转换为字符串。

ALTER PROCEDURE [dbo].[GetLiquidDataPagedAndSorted] (         
@startRowIndex int,
@maximumRows int,
@wellname nvarchar(20),
@thedate nvarchar(10),
@sortExpression nvarchar(100)) AS
-- Make sure a @sortExpression is specified
IF LEN(@sortExpression) = 0
SET @sortExpression = 'GetTime Desc'
-- Issue query
DECLARE @sql nvarchar(2000)
SET @sql = 'SELECT * FROM (SELECT *,ROW_NUMBER() OVER (ORDER BY ' + @sortExpression + ') AS RowNum
FROM LiquidData ) AS LiquidDataWithRowNumbers
WHERE
RowNum > ' + CONVERT(nvarchar(10), @startRowIndex) + ' and RowNum <= (' + CONVERT(nvarchar(10), @startRowIndex) + ' + ' + CONVERT(nvarchar(10), @maximumRows) + ')
and wellname='+@wellname+' and
gettime>= '+@thedate+' and gettime<'+dateadd(day,1,@thedate)
-- Execute the SQL query
exec sp_executesql @sql

谢谢。
...全文
270 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
shiyiwan 2014-08-18
  • 打赏
  • 举报
回复
引用 9 楼 dotnetstudio 的回复:
要得到执行一个存储过程的结果,可以这样用

insert into #temptable
    exec 存储过程名 @param1,@param2,……
+1
shinger126 2014-08-18
  • 打赏
  • 举报
回复
--这样试试 ALTER PROCEDURE [dbo].[GetLiquidDataPagedAndSorted] ( @startRowIndex int, @maximumRows int, @wellname nvarchar(20), @thedate nvarchar(10), @sortExpression nvarchar(100)) AS -- Make sure a @sortExpression is specified IF LEN(@sortExpression) = 0 SET @sortExpression = 'GetTime Desc' -- Issue query DECLARE @sql nvarchar(2000) SET @sql =N 'SELECT * FROM (SELECT *,ROW_NUMBER() OVER (ORDER BY ' + @sortExpression + ') AS RowNum FROM LiquidData ) AS LiquidDataWithRowNumbers WHERE RowNum > ' + CONVERT(nvarchar(10), @startRowIndex) + ' and RowNum <= (' + CONVERT(nvarchar(10), @startRowIndex) + ' + ' + CONVERT(nvarchar(10), @maximumRows) + ') and wellname='+@wellname+' and gettime>= '+@thedate+' and gettime<'+dateadd(day,1,@thedate) -- Execute the SQL query print @sql --先看看你拼接的语句有没有问题
KeepSayingNo 2014-08-18
  • 打赏
  • 举报
回复
要得到执行一个存储过程的结果,可以这样用

insert into #temptable
    exec 存储过程名 @param1,@param2,……
walkeeper 2014-08-18
  • 打赏
  • 举报
回复
执行动态SQL的话是exec(@sql)吧
xzb001 2014-08-18
  • 打赏
  • 举报
回复
直接使用 exec (@sql)
zhendemo_13 2014-08-18
  • 打赏
  • 举报
回复

--使用动态SQL请考虑SQL注入问题
ALTER PROCEDURE [dbo].[GetLiquidDataPagedAndSorted] (         
@startRowIndex int,     
@maximumRows int,
@wellname nvarchar(20),
@thedate nvarchar(10),
@sortExpression nvarchar(100) ='') AS  
-- Make sure a @sortExpression is specified 
IF LEN(@sortExpression) = 0     
    SET @sortExpression = 'GetTime Desc'  
-- Issue query 
DECLARE @sql nvarchar(2000) 
SET @sql = 'SELECT * FROM (SELECT *,ROW_NUMBER() OVER (ORDER BY ' + @sortExpression + ') AS RowNum  
            FROM LiquidData ) AS LiquidDataWithRowNumbers 
            WHERE 
            RowNum > ' + CONVERT(nvarchar(10), @startRowIndex) + ' and RowNum <= (' + CONVERT(nvarchar(10), @startRowIndex) + ' + ' + CONVERT(nvarchar(10), @maximumRows) + ') 
            and wellname='+@wellname+'
            and gettime>= '+@thedate +' and gettime<'+CONVERT(VARCHAR(10),DATEADD(day,1,@thedate),111)
-- Execute the SQL query 
--PRINT @sql
EXEC sp_executesql  @sql
/*
EXEC  GetLiquidDataPagedAndSorted 1,10,'X','2014-8-1',''
*/

 
神崎橙 2014-08-18
  • 打赏
  • 举报
回复
因为拼的时候有问题

ALTER PROCEDURE [dbo].[GetLiquidDataPagedAndSorted] (         
@startRowIndex int,     
@maximumRows int,
@wellname nvarchar(20),
@thedate nvarchar(10),
@sortExpression nvarchar(100)) AS  
-- Make sure a @sortExpression is specified 
IF LEN(@sortExpression) = 0     
	SET @sortExpression = 'GetTime Desc'  
-- Issue query 
DECLARE @sql nvarchar(2000) 
SET @sql = 'SELECT * FROM (SELECT *,ROW_NUMBER() OVER (ORDER BY ' + @sortExpression + ') AS RowNum  
			FROM LiquidData ) AS LiquidDataWithRowNumbers 
			WHERE 
			RowNum > ' + CONVERT(nvarchar(10), @startRowIndex) + ' and RowNum <= (' + CONVERT(nvarchar(10), @startRowIndex) + ' + ' + CONVERT(nvarchar(10), @maximumRows) + ') 
		    and wellname='''+@wellname+'''
			and gettime>= '+@thedate+' and gettime<'''+ CONVERT(VARCHAR(32),dateadd(day,1,@thedate)) + ''''
-- Execute the SQL query 
 exec sp_executesql  @sql
dateadd(day,1,@thedate) 这里返回的日期,和字符串相加会报错。 另外 wellname='''+@wellname+'''少了左右引号 这种建议还是用变量方式来传入吧
b249833177 2014-08-17
  • 打赏
  • 举报
回复
引用 5 楼 shiyiwan 的回复:
exec sp_executesql @sql 后面需要接output参数接受返回结果。http://msdn.microsoft.com/zh-cn/library/ms188001(v=sql.90).aspx
输出参数不能输出结果集啊,只能输出值。 请问有没有其他办法?
shiyiwan 2014-08-17
  • 打赏
  • 举报
回复
exec sp_executesql @sql
后面需要接output参数接受返回结果。http://msdn.microsoft.com/zh-cn/library/ms188001(v=sql.90).aspx
b249833177 2014-08-17
  • 打赏
  • 举报
回复
引用 3 楼 shiyiwan 的回复:
后面有两个条件为什么写在分页外面?这样结果都要变成随机了吧。 没穿入排序表达式时sql没有报错么?
没有传入排序表达式不会报错。我把sql语句的变量都替换成静态值,在查询分析器中执行有结果集返回,但是执行存储过程并传入参数,却没有结果集返回,很头疼,不知道怎么回事。
shiyiwan 2014-08-16
  • 打赏
  • 举报
回复
后面有两个条件为什么写在分页外面?这样结果都要变成随机了吧。 没穿入排序表达式时sql没有报错么?
b249833177 2014-08-16
  • 打赏
  • 举报
回复
不好意思,有一点说错了,问题2的错误是“从字符串向 datetime 转换时失败”。
b249833177 2014-08-16
  • 打赏
  • 举报
回复
没有人吗???

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧