动态查询的SQL错误

伊加夫什涅

这可能很容易解决,但是我似乎看不到问题所在。

错误如下:

消息102,级别15,状态1,第30行
'TTP ID'附近的语法不正确。

消息137,级别15,状态2,第36行
必须声明标量变量“ @TransPeriodID”。

这是脚本:

create procedure [dbo].[InsertPayrollTransactions] 
    @TransPeriodID int, 
    @PayrollID int, 
    @TableCode int
as
begin
    DECLARE @SQLString NVARCHAR(MAX)
    DECLARE @ParmDefinition NVARCHAR(500)

    IF @TableCode > 5 OR @TableCode < 0
    BEGIN
        SET @TableCode = 0
    END

    SELECT @SQLString = 
       'INSERT INTO [dbo].[TA Payroll Transactions' + CASE @TableCode
                                                                                                   WHEN 0 THEN ''
                   WHEN 1 THEN '1'
                   WHEN 2 THEN '2'
                   WHEN 3 THEN '3'
                   WHEN 4 THEN '4'
                   WHEN 5 THEN '5'
        END + '] ([TTP ID], [Payroll ID])
        VALUES (@TransPeriodID, @PayrollID)'

    SET @ParmDefinition = N'([TTP ID] int, [Payroll ID] int)'

    -- PRINT @SQLString
    EXECUTE sp_executesql @SQLString, 
               @ParmDefinition, 
               @TransPeriodID = @TransPeriodID,
               @PayrollID = @PayrollID
end

我执行此操作的方式有所不同(不使用动态SQL),但一位同事建议这样做。他为我提供了一个类似脚本的示例,该示例工作正常,但显然在将其应用于此脚本时出现了错误。我试图比较我可能错过了什么(逗号或撇号)但无济于事的地方。

卢卡斯·索佐达(Lukasz Szozda)

在使用动态SQL之前,请阅读sp_executesql错误使用会导致更多的问题,而不是带来好处,并且可能会导致SQL注入攻击。

sp_executesql [@stmt =]语句[{,[@params =]

N'@ parameter_name数据类型[OUT | 输出] [,... n]'}

{,[@ param1 =]'value1'[,... n]}]

您需要设置参数:

/* Yours */
SET @ParmDefinition = N'([TTP ID] int
    , [Payroll ID] int)'

/* Correct */
SET @ParmDefinition = N'@TransPeriodID INT
    , @PayrollID INT';

EXECUTE [dbo].[sp_executesql]
        @SQLString
       ,@ParmDefinition
       ,@TransPeriodID
       ,@PayrollID;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章