【问题标题】:Running sp_executesql query expects parameter @statement运行 sp_executesql 查询需要参数 @statement
【发布时间】:2009-04-16 16:08:43
【问题描述】:

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

过程或函数“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' 的正确用法,以及它在这个语句中是否正确。

感谢您的帮助。

【问题讨论】:

    标签: sql-server-2005 stored-procedures


    【解决方案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 的增量更新字段。它是来自 stackoverflow.com/questions/753947/… 的引用
    • 例如:迭代 1 使用有效日期_1,迭代 2 使用有效日期_2,等等
    • Closer :D 得到这个错误 必须声明标量变量@b,我不知道为什么,因为它声明在顶部
    • 唷 - 动态 SQL 几乎是一团糟,尤其是当您尝试将字段名称和其他内容“连接在一起”时.....
    • Painfully close.." Msg 245, Level 16, State 1, Line 1 将 varchar 值 'effective_date_' 转换为数据类型 int 时转换失败。"
    【解决方案2】:

    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 是什么。你觉得它是什么?它是某种类型的角色集吗?为什么你认为这是必要的?

    【讨论】:

    • N'' 表示一个 UNICODE (NVARCHAR) 字符串
    猜你喜欢
    • 2018-03-01
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多