运行sp_executesql查询需要参数@statement

时间:2009-04-16 16:08:44

标签: sql-server-2005 stored-procedures

我不确定如何解决此错误:

过程或函数'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_'+@b)+N'
    N'where convert(datetime,'effective_date_'+@b)+N' <= dateadd(day,90,ORSA_CHARGE_OFF_DATE)
    and DRC_FLAG_'+@b = 'C'''

SET @a = @a + 1
END

另外,你能否帮助我理解N'的正确用法以及它是否在本声明中正确使用。

感谢您的协助。

2 个答案:

答案 0 :(得分:1)

“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语句的整个字符串。内部的任何撇号都必须重复(“逃逸”)。我希望我能正确理解你的逻辑。

马克

答案 1 :(得分:1)

sp需要一个string类型的变量,而不是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是什么。你觉得它是什么?它是某种角色集的演员吗?为什么你认为这是必要的?