2012-09-12 75 views
2

今天,我讓我的數據庫名稱類似的:如何使用T-SQL查詢變量

set @databaseNameTXT = 'NewStat1DB'; 

然後我插入數據到右表這樣的:

IF @databaseNameTXT = 'NewStat1DB' 
    BEGIN 
     INSERT INTO [NewStat1DB] (wStat_id) values(@wStat_id) 
    END 

IF @databaseNameTXT = 'NewStat2DB' 
    BEGIN 
     INSERT INTO [NewStat2DB] (wStat_id) values(@wStat_id) 
    END 

哪有我用的變量T-SQL內部並運行它,這樣的:

INSERT INTO [@databaseNameTXT](wStat_id)值(@wStat_id)

謝謝

回答

3

您需要使用dynamic SQL爲此,但您需要注意SQL Injection

數據庫,模式,表和列名不能是變量 - 唯一的方法是使用動態SQL。

例如(這是容易受到SQL注入):

sp_executesql 'INSERT INTO [' + @databaseNameTXT + 
       '] (wStat_id) values(' + @wStat_id + ');'; 

我建議您閱讀鏈接文章 - 它是動態SQL主題的綜合治療。

+0

這是容易出現SQL注入,不應該被使用。 – Tomalak

+1

如果您嘗試動態地發送表名稱,那麼接近100%的機會會導致設計不佳。 – HLGEM

+0

SQL注入攻擊不是每個用例中的一個因素。如果他沒有從可公開獲取的數據中獲取數據,那並不重要。例如,他可以使用SQL服務器代理運行的腳本或手動運行的腳本進行後端更新。 – Jim

0

您可以使用動態SQL這樣的:

declare @query nvarchar(max) 

set @query = 'INSERT INTO ' + QUOTENAME(@databaseNameTXT) + '(wStat_id) 
       values('[email protected]_id+')' 

exec(@query)