Sql 具有变量tablename的查询

Sql 具有变量tablename的查询,sql,sql-server,stored-procedures,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

我不知道为什么总是碰到这些问题,但我在存储过程方面遇到了一个小问题。其中唯一的特殊之处是变量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)

@TableName
之间需要一个空格,其中

SELECT @SQL = 'select SUM(tijd) from ' + @TABLENAME + ' where Scanner = @scanner';

如果您只是在运行SQL之前打印出SQL,那么这种错误是非常明显的。

始终在动态SQL中引用表名,以避免SQL注入(cf)

其次,将
@scanner
参数提供给
sp_executesql
过程,如下面的示例所示:

SELECT @SQL = 'select SUM(tijd) from ' + QUOTENAME(@TABLENAME) + ' where Scanner = @scanner'
EXEC sp_executesql @SQL, N'@scanner NVARCHAR(50)', @scanner;

使用上面的sql,我得到了我的结果。