2016-09-20 148 views
0

有兩個表具有相同的結構(相同的列,相同的列名等)。動態選擇表

如何設計查詢,以便查詢某個表,具體取決於變量?

DECLARE @MYVAR SMALLINT = 0; 

DECLARE @TABLENAME VARCHAR(MAX); 
SET @TABLENAME = CASE WHEN @MYVAR = 1 THEN 'TABLE1' ELSE 'TABLE2' END 

SELECT @TABLENAME 

-- HOW TO DYNAMICALLY SELECT TABLE NAME HERE? 
SELECT TOP 1 * FROM @TABLENAME 

Technet docs暗示了可能使用一個表的別名在這裏,但examples沒有顯示出與此相關的任何東西。

回答

2

正如你所說,你需要動態地建立查詢,如果你想保持它在純SQL(沒有程序的一部分),它可以這樣做執行它

DECLARE @MYVAR SMALLINT = 0; 

DECLARE @TABLENAME VARCHAR(MAX); 
SET @TABLENAME = CASE WHEN @MYVAR = 1 THEN 'TABLE1' ELSE 'TABLE2' END 

declare @sql = 'SELECT TOP 1 * FROM '+ quotename(@TABLENAME) 

Exec (@sql) -- To execute the query that is built dynamically 
1

SELECT * FROM TABLE1 WHERE @MYVAR = 1 
UNION ALL 
SELECT * FROM TABLE2 WHERE @MYVAR = 0 

SQL Server應該足夠聰明,可以將其中一個條件評估爲「始終爲false」並跳過閱讀其他表。請參閱EXPLAIN以確認。

2

除了使用動態SQL顯而易見的解決方案(你需要,特別是如果你的列列出可能是一樣的),你可以是這樣的:

DECLARE @tblName VARCHAR(100)='tbl1'; 

SELECT Col1, Col2, Col3 
FROM tbl1 
WHERE @tblName='tbl1' 
UNION ALL 
SELECT Col1, Col2, Col3 
FROM tbl2 
WHERE @tblName='tbl2' 

最大的好處是,這種方法可以用作VIEW或更好,因爲inline TVF