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