Sql 动态选择表

Sql 动态选择表,sql,sql-server,sql-server-2008,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? SELEC

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

如何设计查询,以便根据变量从中查询某个表

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

此处可能会提示使用表别名,但不会显示与此相关的任何内容。

如您所述,您需要动态构建查询并执行它

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

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

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

如果希望将其保存在纯SQL中(不包含过程部分),可以这样做:

SELECT * FROM TABLE1 WHERE @MYVAR = 1
UNION ALL
SELECT * FROM TABLE2 WHERE @MYVAR = 0
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'

SQL Server应该足够聪明,可以将其中一个条件评估为“始终为false”,并跳过读取另一个表。请参阅
EXPLAIN
以确认这一点。

如果希望将其保存在纯SQL中(不包含过程部分),可以这样做:

SELECT * FROM TABLE1 WHERE @MYVAR = 1
UNION ALL
SELECT * FROM TABLE2 WHERE @MYVAR = 0
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'

SQL Server应该足够聪明,可以将其中一个条件评估为“始终为false”,并跳过读取另一个表。请查阅
解释
以确认这一点。

除了使用动态SQL的明显解决方案之外(特别是当您的列列表可能不相同时,您需要动态SQL),您可以这样做:

SELECT * FROM TABLE1 WHERE @MYVAR = 1
UNION ALL
SELECT * FROM TABLE2 WHERE @MYVAR = 0
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'

最大的优点是,这种方法是内联的,可以用作
视图
,或者更好地用作
内联TVF
,除了动态SQL的明显解决方案之外(特别是当您的列列表可能不相同时,您需要动态SQL),您可以这样做:

SELECT * FROM TABLE1 WHERE @MYVAR = 1
UNION ALL
SELECT * FROM TABLE2 WHERE @MYVAR = 0
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'
最大的优点是,这种方法是内联的,可以用作
视图
,或者更好地用作
内联TVF