我不确定如何解决此错误:
过程或函数'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'的正确用法以及它是否在本声明中正确使用。
感谢您的协助。
答案 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
是什么。你觉得它是什么?它是某种角色集的演员吗?为什么你认为这是必要的?