2015-12-22 141 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