这可能很容易修复,但我似乎无法看到问题。
以下是错误:
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),但是一位同事建议这样做。他给了我一个类似脚本的例子,这很好用,但显然我把它应用到这个脚本时出了点问题。我试图比较一下我可能遗漏的东西(逗号或撇号),但无济于事。
答案 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;