运行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语句的整个字符串。里面的任何撇号必须重复(“转义”)。我希望我能正确理解你的逻辑。
马克
答
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
是。你觉得它是什么?它是否会转换成字符集?你为什么认为这是必要的?
我试图在一个循环中动态地运行我的更新,所以每次迭代更新字段的增量为1.它是从http://*.com/questions/753947/using-while-loop-for -SQL-服务器更新 – homerjay 2009-04-16 16:26:30
例如:迭代1使用effective_date_1,迭代2使用effective_date_2等 – homerjay 2009-04-16 16:27:20