在我的LiveAppDB中,我们有大量的视图引用了更大的LiveProduction数据库。我想要做的是切换代码以查看TestProduction数据库,具体取决于运行视图的应用程序数据库
-- VIEW CAN RUN ON LiveApplicationDB or TestApplicationDB
SELECT COL1, COL2
FROM (CASE WHEN DB_NAME() = ‘LiveApplicationDB‘ THEN LIVEPRODUCTION.DB.DBTABLE ELSE TESTPRODUCTION.DB.DBTABLE END) AS tabl1 -- CASE TO DETERMINE WHICH PRODUCTION DB TO USE
INNER JOIN dbo.ThisDBTable BRA
ON tabl1.product COLLATE Latin1_General_BIN = BRA.product
WHERE (tabl1.COL1 IS NOT NULL)
为了帮助澄清这一点...... 如果视图LiveAppDB使用LiveProductionDB,则TestAppDB使用TestProductionDB
显然你不能在视图中使用变量。
任何帮助都非常感激。
答案 0 :(得分:1)
在LiveProductionDB中创建一个同义词,指向LIVEPRODUCTION.DB.DBTABLE,并在TestAppDB中指向TESTPRODUCTION.DB.DBTABLE时具有相同名称的同义词。在查询中使用同义词。您可能应该在部署脚本中添加类似的内容:
IF DB_NAME() = 'LiveApplicationDB'
CREATE SYNONYM dbo.DBTABLE FOR LIVEPRODUCTION.DB.DBTABLE;
IF DB_NAME() = 'LiveApplicationDB'
CREATE SYNONYM dbo.DBTABLE FOR TESTPRODUCTION.DB.DBTABLE;
仅供参考:我尝试过的大多数比较工具会忽略同义词的目的地,因此这不会被视为差异。
编辑:我建议不要直接在其他数据库中使用对象。例如:当dbA需要dbB中的某些对象时,我在dbA中创建一个名为dbB的模式,并将同义词放在此模式中,引用dbB中dbB中的对象。在大多数情况下,我还在dbB中创建一个名为dbA的模式,并将视图和sprocs放在那里,仅供dbA使用。 dbA仅允许使用dbB中dbA模式中放置的对象。进一步解释这种方法背后的原因:
答案 1 :(得分:0)
如果服务器已链接,那么您可以使用四部分命名约定指向您的测试实例 - 只需限定名称,如下所示: (例如,当DB_NAME()='LiveApplicationDB'然后LiveServer.LIVEPRODUCTION.DB.DBTABLE ELSE TestServer.TESTPRODUCTION.DB.DBTABLE END 但是,如果你有知识/权力,你必须让你的DBA同意链接服务器,或者自己动手。
娜
答案 2 :(得分:0)
我对你的处理方式略有不同。您始终使用表dbo.ThisDBTable。使用此作为基表,然后通过db_name()
子句中的ON
检查加入其他人;
-- VIEW CAN RUN ON LiveApplicationDB or TestApplicationDB
SELECT BRA.COL1
,COLLATE(tab1.COL2, tab2.COL2) COL2
FROM dbo.ThisDBTable BRA
LEFT JOIN LIVEPRODUCTION.DB.DBTABLE tab1
ON BRA.product = tab1.product COLLATE Latin1_General_BIN
AND DB_NAME() = 'LiveApplicationDB'
LEFT JOIN TESTPRODUCTION.DB.DBTABLE tab2
ON BRA.product = tab2.product COLLATE Latin1_General_BIN
AND DB_NAME() = 'TestProductionDB'
WHERE tab1.COL1 IS NOT NULL