这行得通吗?
CREATE VIEW myView
AS
SELECT t.* FROM myTable1 t JOIN myControlTable c ON c.pk = 1 AND c.value = 1
UNION ALL
SELECT t.* FROM myTable2 t JOIN myControlTable c ON c.pk = 1 AND c.value = 2
您可能必须添加 WITH (NOLOCK) 作为“另一个” MyTable 在您处理它时可能会被锁定。
另一种解决方案是在两个表之间交换数据。这样,您将始终拥有一个“活动”表和一个“工作”表。=> 您的“报告”始终查看活动表 => 您的“处理”始终查看工作表
然后为此使用 ALTER TABLE SWITCH 命令。通常用于分区,但我相信它也可以在两个相同的表之间使用。
恕我直言,这将是一个更好的解决方案,因为您的报告和处理都不需要“动态”代码,但始终指向同一张表。
一些示例代码来说明我的意思:
-- cleanup
IF OBJECT_ID('myTable1') IS NOT NULL DROP TABLE myTable1
IF OBJECT_ID('myTable2') IS NOT NULL DROP TABLE myTable2
IF OBJECT_ID('swapTable') IS NOT NULL DROP TABLE swapTable
GO
-- creat 3 identical tables
CREATE TABLE myTable1 (pk int IDENTITY(1, 1) NOT NULL
CONSTRAINT pkTable1 PRIMARY KEY (pk),
value int NULL)
CREATE TABLE myTable2 (pk int IDENTITY(1, 1) NOT NULL
CONSTRAINT pkTable2 PRIMARY KEY (pk),
value int NULL)
CREATE TABLE swapTable (pk int IDENTITY(1, 1) NOT NULL
CONSTRAINT pkSwapTable PRIMARY KEY (pk),
value int NULL)
-- insert some data
INSERT myTable1 (value) VALUES (123)
INSERT myTable1 (value) VALUES (456)
INSERT myTable2 (value) VALUES (-1)
-- current situation
SELECT info = 'MyTable1', * FROM myTable1
SELECT info = 'MyTable2', * FROM myTable2
-- swap tables around
TRUNCATE TABLE swapTable
ALTER TABLE myTable1 SWITCH TO swapTable
TRUNCATE TABLE myTable1
ALTER TABLE myTable2 SWITCH TO myTable1
TRUNCATE TABLE myTable2
ALTER TABLE swapTable SWITCH TO myTable2
GO
-- new situation
SELECT info = 'MyTable1', * FROM myTable1
SELECT info = 'MyTable2', * FROM myTable2