动态查询

时间:2015-08-28 12:18:53

标签: sql-server

这可能很容易修复,但我似乎无法看到问题。

以下是错误:

  

Msg 102,Level 15,State 1,Line 30
  “TTP ID”附近的语法不正确。

     

Msg 137,Level 15,State 2,Line 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),但是一位同事建议这样做。他给了我一个类似脚本的例子,这很好用,但显然我把它应用到这个脚本时出了点问题。我试图比较一下我可能遗漏的东西(逗号或撇号),但无济于事。

1 个答案:

答案 0 :(得分:2)

使用动态SQL read sp_executesql之前。 错误使用会导致更多问题而不是利益,并允许SQL注入攻击。

  

sp_executesql [@stmt =]声明[{,[@ params =]

     

N'@ parameter_name data_type [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;