2015-08-28 28 views
0

这可能很简单,但我似乎无法看到问题所在。动态查询的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)的方式不同,但同事提出这一点。他给了我一个类似脚本的例子,并且工作正常,但是很明显,我在将它应用到此脚本时出错了。我试图比较我可能错过了什么(逗号或撇号),但无济于事。

回答

2

在使用动态SQL之前read sp_executesql。 错误地使用可能导致更多的问题而不是好处,并允许SQL注入攻击。

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

N'@ PARAMETER_NAME DATA_TYPE [OUT | OUTPUT] [,... n]的”}

{[@参数1 =] '值1'[,... N]}]

您需要设置PARAMS:

/* 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; 
+0

感谢您的链接。 – Igavshne