超奇怪的问题,百思不得其解.大家帮忙.EXEC(@Sql) 和把@Sql PRINT出来再执行居然不一样?

yiyioo 2006-08-14 03:22:42
在一个存储过程中
有大致如下内容
CREATE PROCEDURE ....
...
@Para
...
AS
BEGIN
...
SET @Sql = '.....'

PRINT(@Sql) --输出sql

EXEC(@Sql) --执行sql

END

EXEC(@Sql)无法得到记录集,也不报错误
然而在消息里将输出的sql copy出来直接执行,却有记录集.
这就是百思不得其解的地方.
执行相同的sql,得到不同的结果.,


其他说明信息:
这个是一个分页存储过程.
而这种情况发生在第二页及其之后的页.
也就是说当显示第一页能得到记录集,到第二页之后就得不到了,当然第二页是有数据的.
他们的差别只在一个变量的值的大小不同,
,并且这个存储过程在别的程序里调用很正常.

想问问为什么执行PRINT出来的sql和直接执行sql怎么会不一样.
还有为什么第一页可以第二页就不可以


对了,sql中还包含一个多语句表值函数,
假如我把多语句表值函数替换成表则没有问题,
可是这个多语句表值函数在第一页和第二页返回的数据是相同的.


想了好多天了,就是想不出原因.
大家帮帮忙吧...

...全文
506 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
zsforever 2006-08-15
  • 打赏
  • 举报
回复
SET ROWCOUNT @PageSize
SET @Sql='SELECT ' + @Columns + ' FROM (SELECT ROW_NUMBER() OVER(ORDER BY '+@SortColumns+' ' + @SortType+') as rowNum, '+ @Columns+ '
FROM '+ @TableName+ ' WHERE (1=1) '+@Conditions+') as t WHERE rowNum >= '+CAST(@StartId as varchar(32))+@Conditions+' ORDER BY '+@SortColumns+' '+@SortType
------------------------------------------------------------------------------
--建议改成下面试验下
SET @Sql='SELECT ' + @Columns + ' FROM (SELECT ROW_NUMBER() OVER(ORDER BY '+@SortColumns+' ' + @SortType+') as rowNum, '+ @Columns+ '
FROM '+ @TableName+ ' WHERE (1=1) '+@Conditions+
') as t WHERE rowNum >= '+CAST(@StartId as varchar(32))
+ ' and rowNum < ' + CAST(@StartId+@PageSize as varchar(32)) + ' '
+@Conditions+' ORDER BY '+@SortColumns+' '+@SortType
zsforever 2006-08-15
  • 打赏
  • 举报
回复
SET ROWCOUNT @PageSize
这个是你内部,外部执行结果不同的原因吧
zsforever 2006-08-15
  • 打赏
  • 举报
回复
sql2000我类似的存储过程可以正常运行啊
楼主的2005我还没用过,语句我看不出什么问题,帮你顶下
可能是row_number()的问题吧
yiyioo 2006-08-15
  • 打赏
  • 举报
回复
谢谢各位的回答~
今天忘记来看了,现在要回去了
得明天看看了,再揭贴~
yiyioo 2006-08-15
  • 打赏
  • 举报
回复
SELECT @RecordCount AS RecordCount,@CurrentPage AS CurrentPage,@PageCount AS PageCount,@PageSize as CountPerPage

这句是返回一个分页信息的
总共多少条记录,当前第几页,页数,每页大小
jobs002 2006-08-15
  • 打赏
  • 举报
回复
不是很明白
pao1uo 2006-08-15
  • 打赏
  • 举报
回复
SELECT @RecordCount AS RecordCount,@CurrentPage AS CurrentPage,@PageCount AS PageCount,@PageSize as CountPerPage

这一句多余吧
heat 2006-08-14
  • 打赏
  • 举报
回复
哦,exec('sql')的返回集(值或结果集)对exec外是不可见的,除非用物理表或临时表过渡一下,用临时表还必须在exec外先创建一下,否则临时表的结果集在exec外
也查不到
yiyioo 2006-08-14
  • 打赏
  • 举报
回复
原来是因为为了方便同事调用,所以我把存储过程改成了函数
现在带来这么个奇怪的问题,而且函数的效率又低,
所以现在改成了临时表,问题也解决了
只是同事调用的时候不太方便.

还有就是不明白这个究竟是什么原因?
等到明天揭贴~
如果有好的答案,就把帖子的分数加到200~
反正俺可用分还有几千~
logoes 2006-08-14
  • 打赏
  • 举报
回复
yiyioo 2006-08-14
  • 打赏
  • 举报
回复
同事写的,不知道侵不侵犯著作权.......
见谅见谅........
返回两个表,
第一个具体的数据.
第二个分页信息.
我上面指的得不到正确的结果是第一个表,第二个表的数据始终正确.
CREATE PROCEDURE [dbo].[P_ESPager2005]
@CurrentPage int, --当前页
@PageSize int, --每页大小
@TableName nvarchar(4000), --表名,我调用的时候用sql语句构造了一个表,其中就用到了自定义函数
@Columns nvarchar(1000), --需要获得的列
@Conditions nvarchar(3000), --查询条件
@SortColumns nvarchar(40), --排序列
@SortType nvarchar(4) --排序方式
AS
set nocount on
DECLARE @Sql nvarchar(4000),@RecordCount int,@PageCount int,@StartId int
SET @Sql='SELECT @RecordCount = COUNT(*) FROM ' +@TableName+' WHERE (1=1) '+@Conditions
EXECUTE sp_executesql @Sql,N'@RecordCount int OUTPUT',@RecordCount OUTPUT
SET @PageCount= (@RecordCount - 1) / @PageSize + 1
IF @PageCount=0
SET @PageCount=1
IF @CurrentPage >@PageCount
SET @CurrentPage =@PageCount
IF @CurrentPage < 1
SET @CurrentPage = 1
SET @StartId = (@CurrentPage -1) * @PageSize + 1

SET ROWCOUNT @PageSize
SET @Sql='SELECT ' + @Columns + ' FROM (SELECT ROW_NUMBER() OVER(ORDER BY '+@SortColumns+' ' + @SortType+') as rowNum, '+ @Columns+ '
FROM '+ @TableName+ ' WHERE (1=1) '+@Conditions+') as t WHERE rowNum >= '+CAST(@StartId as varchar(32))+@Conditions+' ORDER BY '+@SortColumns+' '+@SortType

print @Sql

EXEC(@Sql)
SELECT @RecordCount AS RecordCount,@CurrentPage AS CurrentPage,@PageCount AS PageCount,@PageSize as CountPerPage

pao1uo 2006-08-14
  • 打赏
  • 举报
回复
贴代码,免得猜
pao1uo 2006-08-14
  • 打赏
  • 举报
回复
第二页是不是第二次调用?
logoes 2006-08-14
  • 打赏
  • 举报
回复
看看
abc_sk 2006-08-14
  • 打赏
  • 举报
回复
把代码贴出来,看下。

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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