日期:2014-05-18  浏览次数:20465 次

动态语句的求和出错

declare   @ss   nvarchar(1000)
declare   @Total   decimal(18,2)
set   @total=0
set   @ss= 'select   '   +   @total     +   '   =   sum(isnull(Order_qty,0))     from   tb '
execute   (@ss)
select   @Total
错误提示:
Error   converting   data   type   varchar   to   numeric.

若对@total进行数据类型转化也不行啊

请问怎么解决?

------解决方案--------------------
declare @ss nvarchar(1000)
declare @Total decimal(18,2)
set @total=0
set @ss=N 'select @total = sum(isnull(Order_qty,0)) from tb '
execute sp_executesql @ss,N '@Total decimal(18,2) OUTPUT ',@total OUTPUT
select @Total
------解决方案--------------------
N表示这个字符串常量是UNICODE的,之所以这样做是因为sp_executesql这个存储过程要求的,其前二个参数类型必须是UNICODE类型的.具体请参考sp_executesql帮助.
通常,当需要从动态SQL中返回值时,只能使用sp_executesql存储过程,并且将要返回的变量加上OUTPUT关键字.
------解决方案--------------------
需要将变量@Total的数据类型转化成字符型:
转化的格式:cast(@Total as char(18))
------解决方案--------------------
int型变量在动态SQL中必须用cast或convert转换为字符串
------解决方案--------------------
为什么用个N就可以把变量放在引号中啊?
----------
因为你@ss定义的类型是nvarchar,表示是unicode字符,所以需要在字符串前面加个N
------解决方案--------------------
你的查询语句语句里面又没有变量,干吗要用动态sql呢
直接:
declare @ss nvarchar(1000)
declare @total decimal(18,2)

select @total = sum(isnull(ksl01,0)) from #tmp where id <1000
execute sp_executesql @ss
select @total
这样不行吗