2015-12-22 44 views
2

我只是想知道是否可以在存儲過程中使用變量。例如:如何在存儲過程中使用變量

CASE @productType 
    WHEN 1 THEN 
    DECLARE @table = ‘products1’ 
    WHEN 2 THEN 
    DECLARE @table = ‘products2’ 
END 

SELECT * FROM @table; 

顯然這不起作用,只是想知道是否有辦法做到這一點。

回答

6

是的,有一種方法。你可以使用動態sql。

DECLARE @productType INT = 1 
DECLARE @table NVARCHAR(MAX) 
DECLARE @sql NVARCHAR(MAX) 

SELECT @table = 
    CASE @productType 
     WHEN 1 THEN 'products1' 
     WHEN 2 THEN 'products2' 
    END 

SELECT @sql = 'SELECT * FROM ' + QUOTENAME(@table); 

EXEC(@sql) 
+0

正是我一直在尋找的感謝。 – user3839756

2

你可以簡單地使用,如果其他if語句:

DECLARE @productType INT = 2 
IF @productType = 1 
    SELECT * FROM products1 
ELSE IF @productType = 2 
    SELECT * FROM products2 

或使用sp_executesql

DECLARE @productType INT = 1; 
DECLARE @table NVARCHAR(MAX); 
DECLARE @sql NVARCHAR(MAX); 


SELECT @table = 
    CASE @productType 
     WHEN 1 THEN 'products1' 
     WHEN 2 THEN 'products2' 
    END; 

SELECT @sql = 'SELECT * FROM ' + QUOTENAME(@table); 

EXEC sp_executesql @sql; 
+0

是的,這是一個簡單的例子,但我想在更復雜的過程中使用這種方法,因爲使用這種方法會很不方便 – user3839756

+0

您能否提供您的方案的解釋,大部分時間最好避免動態SQL – Thomas

+0

我看到這是出於性能原因嗎?該場景基本上是因爲我有一個非常長的聲明,其中表名必須在整個過程中進行更改。有很多情況下,所以我將不得不有20+如果語句和複製粘貼很多代碼 – user3839756