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