2016-09-20 99 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