我们有两个具有相同结构的表,并且基于一个变量,我想选择要选择的表,而不必在我的程序中写入2个查询。
这可能吗?
我试过
declare @table int
set @table = 1
Select orderID, Quantity
from case when @table = 1 then tblOrders else tblSubscriptionOrders end
where filled = 0
但那不起作用
答案 0 :(得分:6)
您需要为此使用动态SQL(假设您希望将其扩展到超过2个表),这可能会起作用但不是最理想的,因为SQL不会为其生成统计信息并且更难以优化查询。
declare @table sysname
declare @SQL varchar(1000)
set @table = 'MyTable'
SET @SQL='SELECT orderID, Quantity FROM ' + QUOTENAME(@table) + ' WHERE filled=0'
exec sp_executesql @SQL
或者,在存储过程中:
CREATE PROCEDURE p_ConditionalSelect @table sysname
as
declare @SQL varchar(1000)
set @table = 'MyTable'
SET @SQL='SELECT orderID, Quantity FROM ' + QUOTENAME(@table) + ' WHERE filled=0'
exec sp_executesql @SQL
答案 1 :(得分:4)
如果只有两张桌子,你可以这样做:
Declare @table = 1
SELECT *
FROM Table1
WHERE <stuff>
AND @Table = 1
UNION ALL
SELECT *
FROM Table2
WHERE <stuff>
AND @Table = 2
@table
上的过滤器只会导致显示数据的两半中的一半。
答案 2 :(得分:3)
一种选择是使用动态SQL,但如果性能不是一个直接的问题,那么只需UNION
表格就可以更简单,并添加一个虚拟[table]
列供选择。
SELECT orderID, Quantity
FROM (
SELECT [table] = 1, orderID, Quantity
FROM tblOrders
UNION ALL
SELECT [table] = 2, orderID, Quantity
FROM tblSubscriptionOrders
) t
WHERE t.Table = @table