手工兼职广州:一个非常奇怪的SQL问题,请高手指点一下^^

来源:百度文库 编辑:高校问答 时间:2024/05/05 21:57:57
我在一个SQL存储过程中写了一个非常长的SQL语句,先用print(@sqlstr),然后exec(@sqlstr),
在查询分析器中报错,然后没办法,我把exec(@sqlstr)给注释掉,--@exec(@sqlstr),只使用print(@sqlstr),在查询分析器运行后,然后又把print的结果放到分析器运行了一下,竟然正常,你说怪不怪!!
exec(@sqlstr)错误的信息为:
服务器: 消息 203,级别 16,状态 2,过程 get_rbb,行 34
名称 'select njda.mc+bjda.mc bjmc,sum(sjf)sjf,sum(sjf)xj,null zz,isnull(sum(xf),0) as xf,isnull(sum(zf),0) as zf,isnull(sum(zsf),0) as zsf from jfjl inner join sfda on jfjl.xsh=sfda.id inner join bjda on sfda.bjh=bjda.id inner
join njda on bjda.njh=njda.id where jfrq between '2006/7/4' and '2006-8-5' and
tag='jfjl' and skfs='现金' group by njda.mc+bjda.mc
union all
select njda.mc+bjda.mc bjm...

存储过程的全文为:
ALTER PROCEDURE get_rbb
@fields varchar(500)='',
@strWhere varchar(50)='',
@startdate varchar(20),
@enddate varchar(20)
AS
declare @sqlstr varchar(5000)
declare @skr varchar(20)
SET NOCOUNT ON
if(@strWhere<>'')
set @skr='and czy=''+@strWhere+'''
else
set @skr=''
set @sqlstr='select njda.mc+bjda.mc bjmc,sum(sjf)sjf,sum(sjf)xj,null zz,'+@fields+' from jfjl inner join sfda on jfjl.xsh=sfda.id inner join bjda on sfda.bjh=bjda.id inner
join njda on bjda.njh=njda.id where jfrq between '+char(39)+@startdate+char(39)+' and '+char(39)+@enddate+char(39)+' and
tag='+char(39)+'jfjl'+char(39)+' and skfs='+char(39)+'现金'+char(39)+@skr+' group by njda.mc+bjda.mc
union all
select njda.mc+bjda.mc bjmc,sum(sjf)sjf,null xj,sum(sjf)zz,'+@fields+' from jfjl inner join sfda on jfjl.xsh=sfda.id inner join bjda on sfda.bjh=bjda.id inner join njda on bjda.njh=njda.id
where jfrq between '+char(39)+@startdate+char(39)+' and '+char(39)+@enddate+char(39)+' and tag='+char(39)+'jfjl'+char(39)+' and skfs='+char(39)+'转帐'+char(39)+@skr+' group by njda.mc+bjda.mc
union all
select njda.mc+bjda.mc bjmc,sum(sjf)sjf,sum(sjf)xj,null zz,'+@fields+' from jfjl inner join sfda on jfjl.xsh=sfda.id inner join bjda on sfda.bjh=bjda.id inner join njda on bjda.njh=njda.id
where jfrq between '+char(39)+@startdate+char(39)+' and '+char(39)+@enddate+char(39)+' and tag='+char(39)+'tfjl'+char(39)+' and skfs='+char(39)+'现金'+char(39)+ @skr+' group by njda.mc+bjda.mc
union all
select njda.mc+bjda.mc bjmc,sum(sjf)sjf,null xj,sum(sjf)zz,'+@fields+' from jfjl inner join sfda on jfjl.xsh=sfda.id inner join bjda on sfda.bjh=bjda.id inner join njda on bjda.njh=njda.id
where jfrq between '+char(39)+@startdate+char(39)+' and '+char(39)+@enddate+char(39)+' and tag='+char(39)+'tfjl'+char(39)+' and skfs='+char(39)+'转帐' +char(39)+ @skr+' group by njda.mc+bjda.mc

print @sqlstr
exec @sqlstr

运行这个试试,前提是@sqlstr要声明成nvarchar类型

exec sp_executesql @sqlstr

EXEC不能直接运行字符串.
@sqlstr为字符串
exec '字符串',你认为可以正常运行吗?
你也可以这样测试
print 'exec'+@sqlstr
结果是什么?你把结果复制到查询分析器.就会遇到同样的问题.

直接运行exec get_rbb

我觉得应该是 像你这样 好象两次执行了sql语句,那个查询分析器本来就是运行sql语句