2016-08-24 139 views
1

如何創建一次指定的變量,然後在腳本中稍後用於查詢中?這些變量可以在查詢中多次使用,也可以在腳本中使用多次查詢。在下面的例子中,我使用@x作爲這樣一個變量。SQL將變量添加到查詢中

我想要做的是一樣的東西:

Declare @Query nvarchar(1000) 
Declare @x nvarchar(40) 

Set @x = 'test' 
Set @Query = 'Select [Name] 
        , ' + @x + ' as [TestCase] 
       From mytable' 

Exec (@Query) 

-- returns "Invalid column name 'test'" 

它返回上面提到的錯誤。我想它實現相當於:

Declare @Query nvarchar(1000) 
Declare @x nvarchar(40) 

Set @x = 'test' 
Set @Query = 'Select [Name] 
        , ''test'' as [TestCase] 
       From mytable' 

Exec (@Query) 

-- Returns e.g. 
-- Name TestCase 
-- Alice Test 
-- Bob Test 

我也注意到以下不工作,並返回相同的錯誤第一:基於錯誤,因爲我

Declare @Query nvarchar(1000) 
Declare @x nvarchar(40) 

Set @x = 'test' 
Set @Query = 'Select [Name] 
        , ' + 'test' + ' as [TestCase] 
       From mytable' 

Exec (@Query) 

-- returns "Invalid column name 'test'" 

我沒有試圖使用@x作爲列名,而只是作爲一個變量,我假設我正在使用變量的無效實現。

回答

2

既然你不能試圖用一個變量作爲列名,你不需要使用動態SQL。

一個簡單的(這是一個好東西(TM)由於動態SQL應謹慎大量使用,由於它是一個偉大的攻擊面。):

declare @x nvarchar(40) 

set @x = 'test' 

select [Name], @x as TestCase 
from mytable 

會做。


話雖這麼說,如果你有一個動態SQL的使用情況(再次在這裏的問題不但或許一個即席查詢被傳遞給該過程的特定查詢),該做的事將通過sp_executesql將您的變量作爲參數傳遞給查詢。這類似於創建具有參數的存儲過程:

declare @x nvarchar(40) 
declare @query nvarchar(1000) 

set @x = 'test' 

set @query = 'select [Name], @x as TestCase from mytable' 

exec sp_executesql @query, N'@x nvarchar(1000)', @x 
+0

哦,非常好,謝謝!這按預期工作。 – conor

+0

接受這個答案,因爲它最徹底地回答我的問題,並簡化它 - 在這種情況下,我實際上並不需要動態SQL。 – conor

+2

我很高興它有幫助。要回答你的問題的後半部分,你可以嘗試'select @ query'來查看正在組成的查詢。你會看到'select [Name],test as ...'將「test」視爲列名。你需要用引號包裝 - 正如其他答案顯示的那樣。但是接下來你會介紹「如果@ x引用了它會發生什麼事情」的問題,這說明了動態SQL的危險。例如,嘗試'set @x ='test'',Name,Name,Name,''hahaha''以及其他答案的查詢之一! –

1
Declare @Query nvarchar(1000) 
Declare @x nvarchar(40) 

Set @x = 'test' 
Set @Query = 'Select [Name],'++''''[email protected]+''''+ ' as [TestCase] 
       From mytable' 

print @query 

輸出:
選擇[名], '測試' 爲[TestCase的] 從MYTABLE

+0

這工作,但我不明白額外的'+'和單引號做什麼。你能否添加一個解釋? – conor

+0

@conor:試試這個..請選擇'','''','''''' – TheGameiswar

2

您錯過了引號。而已。嘗試下面的代碼。

Declare @Query nvarchar(1000) 
    Declare @x nvarchar(40) 

    Set @x = 'test' 
    Set @Query = 'Select [Name] 
         , ''' + @x + ''' as [TestCase] 
        From mytable' 

    Exec (@Query) 
+0

謝謝@Ranjana。爲什麼你需要三個單引號圍繞這個?我知道兩個行爲是逃避,但不知道三個人做了什麼。 – conor

+0

簡單的想法是你已經創建了對列名爲test的搜索的select查詢,因爲它不存在,它會引發錯誤。既然這是列值,所以你應該把它作爲'測試'來傳遞。用'''生成一個報價,所以'''+ @ x +'''變成'測試'。與您的查詢它會是:'+ @ x +' - >測試。由於測試不是列名,所以發生錯誤 –