exec执行sql语句有限制,如何突破这个限制?
本帖最后由 slyzly 于 2014-04-22 12:24:38 编辑
一个分页存储过程,部分代码如下,发现当里面拼接的sql语句过长后,导致无法执行
我删除部分sql语句后,就可以执行,请问那位大神有遇到过这种问题,是如何解决这个问题的?
网上查找了下,参考http://www.cnblogs.com/RascallySnake/archive/2010/05/20/1739839.html里面的,问题还是依旧。
declare @sql1 varchar(200)
set @sql1='SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY '
declare @sql2 varchar(50)
set @sql2=') AS rownumber,'
declare @sql3 varchar(10)
set @sql3=' FROM '
declare @sql4 varchar(100)
set @sql4=') AS tempdt WHERE rownumber BETWEEN '+@startRow+' AND '+@endRow
/*执行查询语句,返回查询结果*/
exec
(
@sql1+@OrderBy+@sql2+@Fields+@sql3+@Table+@Where+@sql4
)
------解决方案--------------------你用的是sql server 2000吗,如果是2000,那么也只能通过拆分成多个字段来解决了,之所以还有问题是因为,还有某个变量,存储了太多的字符,导致被截断,这样拼接出来的语句,就有问题了。
如果是2005,就没有这个问题了,完全可以修改为varchar(max) 类型,支持2G个字节
------解决方案--------------------" 所以最佳的做法是把代码构造到一个变量中,然后再把该变量作为EXEC命令的输入参数,这样就不会受限制了。"那篇文章说的很清楚,让你把sql拼接到一个变量里,而你为什么还要在exec写那么多。
还有能说下你的sql有多长吗,并不是所有东西都要在分页里一次性全查询出来
------解决方案--------------------你定义的变量长度太短了,全部改成varcahr(8000)试试
------解决方案--------------------你可以先print @sql1+@OrderBy+@sql2+@Fields+@sql3+@Table+@Where+@sql4
看看打印出的sql语句是什么,能不能执行。
------解决方案--------------------exec (@sql)即可
------解决方案--------------------如果可能,数据库升级到sql 2008就解决了
------解决方案--------------------先建个临时表或表变量,把包含的字符串插进去,然后结果表关联临时表,条件用like即可。如果只要显示一条结果不显示匹配哪个字符,用exists。
------解决方案--------------------同类型分页一直用的好好的,没发生此类问题,实在不行,把你分页里面的数据先插入个表变量或者零时表,再对表变量或者零时表进行分页
------解决方案--------------------应该是你最后这里:
declare @strsql nvarchar(1200)
set @strsql='SELECT @i=COUNT(*) FROM '+@Table+@Where
execute sp_executesql @strsql,N'@i int out',@Count OUT--返回总记录数
你定义的@strsql只有1200吧,改成nvarchar(max)看看