日期:2014-05-17  浏览次数:20570 次

SQL2005的“必须声明标量变量”错误
SQL code

        declare @icount int
        declare @sql nvarchar(2000)
    set @sql = 'select @icount=count(crmcustomerid) from ' +  @tablename + ' where crmcustomerid  = ' + cast(@pi_iCrmcustomerId as varchar)
    exec sp_executesql @sql,N'@icount int output',@icount output
    select @icount as a

    if @icount > 0 
           ...........



如上代码是放在一个存储过程里执行的,报“必须声明标量变量 "@icount”错误。

------解决方案--------------------
SQL code

 declare @icount int
        declare @sql nvarchar(2000)
    set @sql = 'select '+cast(@icount as varchar(10))+'=count(crmcustomerid) from ' +  @tablename + ' where crmcustomerid  = ' + cast(@pi_iCrmcustomerId as varchar)
    exec sp_executesql @sql,N'@icount int output',@icount output
    select @icount as a

    if @icount > 0

------解决方案--------------------
如果磊仔的没问题我就不说了
------解决方案--------------------
语法应该没什么错误的。
------解决方案--------------------

------解决方案--------------------
2008里 测试楼主代码 没有任何问题啊 
create proc P_TEST
as
declare @tablename varchar(200)='TBA'
declare @icount int
declare @sql nvarchar(2000)
set @sql = 'select @icount=count(a) from ' + @tablename
exec sp_executesql @sql,N'@icount int output',@icount output
select @icount as a
 if @icount > 0 
print 'OK'

------解决方案--------------------
你那个crmcustomerid字段是什么类型?
------解决方案--------------------
最好先确定下 是哪个@icount出了问题。 
declare @icount int
declare @TI int
declare @sql nvarchar(2000)
set @sql = 'select '+cast(@icount as varchar(10))+'=count(crmcustomerid) from ' + @tablename + ' where crmcustomerid = ' + cast(@pi_iCrmcustomerId as varchar)
exec sp_executesql @sql,N'@icount int output',@icount output
select @icount as a
set @TI=@icount
if @TI> 0 

------解决方案--------------------
探讨
经过“奋斗熊”的提示,发现点头绪了,在我if @icount > 1后,begin exec(sql)(去掉这个就一切正常了,哪位兄弟能帮忙解释下) end

谢谢各位的回复。

------解决方案--------------------
MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和

sp_executesql;通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC

没有。还有一个最大的优点就是运用 sp_executesql,能够重用执行计划,这就大大

提供了执行性能(对于这个我在后面的例子中会详加说明),还可以编写更安全的代码

。EXEC在某些情况下会更灵活。除非您有令人信服的理由运用 EXEC,否侧尽量运用

sp_executesql.