使用变量tablename进行查询

时间:2016-10-21 09:46:16

标签: sql sql-server stored-procedures

我不知道为什么我会继续碰到这些,但我对存储过程有一个小问题。其唯一的特色是变量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)

2 个答案:

答案 0 :(得分:2)

您需要@TableNamewhere之间的空格:

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;