From子句

时间:2016-06-20 13:59:29

标签: tsql views

在我的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

显然你不能在视图中使用变量。

任何帮助都非常感激。

3 个答案:

答案 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模式中放置的对象。进一步解释这种方法背后的原因:

  • dbA中对dbB的所有依赖都在两个数据库中明确说明
  • 将dbB移动到另一台服务器是轻而易举的,只需创建一个链接服务器并修改所有同义词。不需要修改或测试过程。
  • Datamodel更改dbB并不一定意味着您需要在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