這項工作?
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
這個唯一的'缺點'是每次(重新)創建同義詞時,都需要重新應用安全性。而且,當你開始查詢元數據時,同義詞需要相當多的時間! (sys.columns等) – deroby
@deroby爲什麼你需要將安全性應用於同義詞?爲什麼不只是基礎表? –
這是否工作?去測試它......聽起來反直覺。 – deroby