动态选择表格

时间:2016-09-20 18:47:15

标签: sql sql-server sql-server-2008

有两个表具有相同的结构(相同的列,相同的列名等)。

如何设计查询以便查询某个表,具体取决于变量?

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不会显示与此相关的任何内容。

3 个答案:

答案 0 :(得分:2)

正如您所提到的,您需要动态构建查询并执行它

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 :(得分: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

答案 2 :(得分:1)

如果你想把它保存在普通的SQL中(没有程序部分),可以这样做:

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

SQL Server应该足够聪明,以评估其中一个条件为"始终为false"并跳过阅读另一张桌子。请咨询EXPLAIN以确认。