2014-11-24 97 views
0

我正在嘗試創建一個過程,其中條件語句根據用戶輸入的值進行更改。下面是我想要實現的簡化示例。如何在條件語句中調用變量(即值列表)?

Create Procedure [LossRatioReport] (@construction AS VARCHAR(2), @state AS VARCHAR(2)) AS 

DECLARE @construction_condition AS NVARCHAR(MAX) 
DECLARE @construction AS VARCHAR(2) 
SET @construction = '01' 
SET @construction_condition = CASE @construction WHEN '01' 
THEN @construction_condition = '('01', 'Frame Construction', 'Frame')' 
ELSE @construction_condition = '00' 
END 

BEGIN 

SELECT year, SUM(loss) 
FROM Database_1 
WHERE id IN (SELECT DISTINCT id FROM Database_2 WHERE construction = @construction_condition) 

END 
GO 

我想這樣做這種方式,因爲有整數和字符串每種類型的列表,我不想一遍又一遍地重寫代碼爲每個條件。但是當我嘗試運行我的代碼時,我不斷收到WHERE語句中變量的錯誤語法消息。

+0

你不能這樣做,就像你正在嘗試。有一件事你在你的案例表達式中遍佈着無效的字符串。要做到這一點,你需要動態的SQL。我會非常不願意這樣做,因爲你需要參數化你的動態sql,因爲這是來自一個參數。似乎最好的方法是重新考慮這一點。 – 2014-11-24 19:23:57

+1

您可以創建一個只存儲ID的臨時表。根據條件,使用您感興趣的ID填充臨時表,並在其中添加「where id in(從#tmp選擇[ID])」 – Jeremy 2014-11-24 19:44:55

回答

1

你需要使用動態SQL這樣的:

DECLARE @sql NVARCHAR(MAX) 

SELECT @sql = 'SELECT year, SUM(loss) 
FROM Database_1 
WHERE id IN (SELECT DISTINCT id FROM Database_2 WHERE construction IN(' + @construction_condition 

EXEC sp_executesql @sql 

肖恩蘭格說,事情或許應該被SQL注入提及。在使用動態SQL實施解決方案之前,請確保您意識到危險。 Here is an overview,谷歌可以告訴你很多,更多。

+0

您需要將「=」更改爲「IN」。可怕的部分是這是廣泛開放的SQL注入。 – 2014-11-24 19:24:46

+0

我想作爲一個varchar(2)它不是超級開放的,但變量聲明可能會改變。 ;) – 2014-11-24 19:25:34

相關問題