2012-05-10 85 views
0

我有一個塊代碼來創建一個過程:程序錯誤「必須聲明表」

CREATE PROCEDURE GetTableinfomation 
    @table nvarchar(50), 
    @column nvarchar(50), 
    @valuedk nvarchar(50) 
AS 
BEGIN 
    SELECT * 
    FROM @table 
    WHERE @column = @valuedk 
END 

和我具有誤差。

消息1087,級別15,狀態2,過程GetTableinfomation,7號線
必須聲明表變量 「@tenbang」。

爲什麼?

+0

正如所暗示的另一個答案'SELECT * FROM @ table'假定你已經用'DECLARE @table TABLE(id INT,etc VARCHAR(16))'創建了一個表變量。您需要構建一個新的SQL字符串並用該新字符串調用'EXEC'或*(最好)*'sp_executesql'。 – MatBailie

回答

2

不能爲表名和列使用SQL參數,只能用於變量。

你可以解決這個問題,通過使用動態SQL:

DECLARE @SQL nvarchar(4000) 
DECLARE @PARAMS nvarchar(4000) 
SET @SQL = 'SELECT * FROM ' 
    + QUOTENAME(@table,'"') + ' WHERE ' 
    + QUOTENAME(@column,'"') + '= @param1' 
SET @PARAMS = '@param1 nvarchar(50)' 
EXEC sp_executesql @SQL, @PARAMS, @[email protected] 

有關更多信息,請參見sp_executesql文檔:

+0

'sp_executesql'通常比'exec'更可取:計劃緩存,參數化等。 – MatBailie

+0

@Dems感謝您的輸入,編輯回答 – Curt