我不知道为什么我会继续碰到这些,但我对存储过程有一个小问题。其唯一的特色是变量Tablename:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE dbo.ProdTijdCompare
@TABLENAME SYSNAME,
@scanner nvarchar(50)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @SQL NVARCHAR(MAX);
SELECT @SQL = 'select SUM(tijd) from ' + @TABLENAME + 'where Scanner = @scanner'
EXEC sp_executesql @SQL;
END
GO
我在SSMM中执行时遇到的错误:
Msg 102, Level 15, State 1, Line 3
Incorrect syntax near '='.
(1 row(s) affected)
答案 0 :(得分:2)
您需要@TableName
和where
之间的空格:
SELECT @SQL = 'select SUM(tijd) from ' + @TABLENAME + ' where Scanner = @scanner';
如果您在运行之前打印出SQL,这种类型的错误非常明显。
答案 1 :(得分:0)
始终在动态SQL中引用表名以避免SQL注入(cf QUOTENAME)
其次,将@scanner
参数提供给sp_executesql
程序,如下面的示例所示:
SELECT @SQL = 'select SUM(tijd) from ' + QUOTENAME(@TABLENAME) + ' where Scanner = @scanner'
EXEC sp_executesql @SQL, N'@scanner NVARCHAR(50)', @scanner;