2016-10-21 202 views
1

我不知道爲什麼我一直在碰到這些,但是我對存儲過程有一個小問題。它唯一特別的是變量表名:查詢變量表名稱

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

始終在動態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; 
+0

使用上面的SQL,我得到了我的結果。 – JamesBB

2

你需要@TableNamewhere之間的空間:

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

如果您在運行SQL之前只打印出SQL,那麼這種類型的錯誤非常明顯。