运行sp_executesql的查询需要参数@statement

问题描述:

我不知道如何解决这个错误:运行sp_executesql的查询需要参数@statement

过程或函数“sp_executesql的”需要参数“@statement”,但未提供。

此查询:

DECLARE @a INT 
DECLARE @b VARCHAR 
SET @a = 1 

WHILE @a < 30 
BEGIN 
set @b = @a 
exec sp_executesql update source_temp set pmt_90_day = pmt_90_day + convert(money,'trans_total_'[email protected])+N' 
    N'where convert(datetime,'effective_date_'[email protected])+N' <= dateadd(day,90,ORSA_CHARGE_OFF_DATE) 
    and DRC_FLAG_'[email protected] = 'C''' 

SET @a = @a + 1 
END 

而且,你能帮助我理解N的正确使用方法”,如果它的这一说法正确。

感谢您的帮助。

“sp_executesql”存储过程期望执行一个字符串参数@statement。

你的字符串完全不符合这里.....你需要在字符串前加上N'......'来使它们成为Unicode字符串,但这肯定是不正确的这里的情况。

我想你可能想试试这个:

DECLARE @a INT 
DECLARE @b VARCHAR(2) 

SET @a = 1 

DECLARE @statement NVARCHAR(500) 

WHILE @a < 30 
BEGIN 
    SET @b = CAST(@a AS VARCHAR(2)) 

    SET @statement = 
     N'update source_temp set pmt_90_day = pmt_90_day + ' + 
      'convert(money, ''trans_total_' + @b + ''') ' + 
      'where convert(datetime, ''effective_date_' + @b + ''')' + 
      ' <= DATEADD(DAY, 90, ORSA_CHARGE_OFF_DATE) ' + 
      'and DRC_FLAG_' + @b + ' = ''C''' 

    exec sp_executesql @statement 

    SET @a = @a + 1 
END 

这是否工作,做你期望它做什么?

说明:N'.........'分隔包含SQL语句的整个字符串。里面的任何撇号必须重复(“转义”)。我希望我能正确理解你的逻辑。

马克

+0

我试图在一个循环中动态地运行我的更新,所以每次迭代更新字段的增量为1.它是从http://*.com/questions/753947/using-while-loop-for -SQL-服务器更新 – homerjay 2009-04-16 16:26:30

+0

例如:迭代1使用effective_date_1,迭代2使用effective_date_2等 – homerjay 2009-04-16 16:27:20

SP的预期字符串类型,而不是一个SQL语句的变量。总结你的SQL在单引号:

exec sp_executesql 'some SQL statement'; 

当你做到这一点,用两个单引号替换每个单引号逃逸声明中任何单引号:

exec sp_executesql 'select 'AB' from dual'; -- wrong 

exec sp_executesql 'select ''AB'' from dual'; -- right 

我不知道什么N是。你觉得它是什么?它是否会转换成字符集?你为什么认为这是必要的?