Database Project视图中的动态变量

时间:2017-09-04 11:47:22

标签: sql-server visual-studio sql-server-data-tools

我有一个带有一些视图的数据库项目。

视图的行为应根据发布的环境而有所不同。

发布到开发环境时,INNER JOIN应使用特定前缀作为目标模式名称,并在测试环境中使用另一个前缀。

有可能实现这一目标吗?在下面的代码片段中,id喜欢在本地开发时和发布到dev环境时使用Hub,以及在发布测试时使用ISA。

示例:

CREATE VIEW [ISA].[v_CoveredRisk]
    AS SELECT
                CR.Bkey_CoveredRisk_Unique
                ,CO.Bkey_Coverage_Unique
                ,CO.Name
                ,PO.EKey_Policy
                ,CoObj.Bkey_CoveredObject
                ,CoObj.BKey_Building
                ,CoObj.Bkey_Home
                ,CoObj.BKey_Object
                ,CoObj.BKey_Person
                ,CoObj.BKey_Pet
                ,CoObj.BKey_Vehicle
                ,Risk_Excess
                ,Risk_Sum
                ,CAST(CurrentYearPremiumAmount AS float) AS CurrentYearPremiumAmount
                ,IsActive
                ,PO.BKey_Policy
                ,CR.Record_Timestamp

     FROM Hub.[CoveredRisk] CR
     INNER JOIN Hub.Coverage CO ON CR.EKey_Coverage = CO.EKey_Coverage
     INNER JOIN Hub.CoveredObject CoObj ON CR.EKey_CoveredObject = CoObj.EKey_CoveredObject
     INNER JOIN Hub.[Policy] PO ON CR.EKey_Policy = PO.Ekey_Policy

3 个答案:

答案 0 :(得分:1)

首先,您应该删除此要求,并在所有数据库中使用相同的代码。你几乎100%保证在某些方面犯了一个错误,并部署一些在不同环境中不起作用的东西。

如果您确实想这样做,可以使用同义词 - 在您的视图中引用同义词并指向相应的模式。您不能直接指向架构的同义词,但可以使用架构中的对象,如果您有:

  • dev table devSchema.table
  • prod table prodSchema.table
在开发中,有一个同义词:

create synonym Hub.table for devSchema.table

然后你的视图引用Hub.table,它将被解析为开发表。

答案 1 :(得分:0)

有一个生成SQL脚本的T4模板

模板中的

找出你正在运行的环境......相应地创建输出

找出生成输出所需的环境,查看发布配置文件和配置特定变量(又名&#34;条件编译符号&#34;在项目的构建属性中)< / p>

您可以在T4模板中探测那些

答案 2 :(得分:0)

您不能在架构或对象名称中使用变量。如果你真的想达到你所说的话,我可以建议你两种方式:

  1. 您不会使用变量控制它,但您可以使用发布配置来控制它。您可以在sqlproj文件中使用条件语句。所以,我创建了2个视图:

    创建视图[HUB]。[查看1]     AS SELECT 1为一个;

    创建视图[ISA]。[查看1]     AS SELECT 1为一个;

  2. 然后在sqlproj文件中我做了以下事情:

    <Build Include="View1.sql" />
    <None Include="View1.sql"  Condition=" '$(Configuration)' == 'Debug'" />
    <None Include="View1_1.sql" />
    <Build Include="View1_1.sql"  Condition=" '$(Configuration)' == 'Release' " />
    

    然后在部署时选择正确的发布配置 enter image description here

    注意:您需要在构建中包含和排除相同的文件才能实现该目标。

    1. 这是一种更简单的方法。始终使用相同的方法创建视图,并将其移动到发布脚本中的正确模式。例如:

      IF DB_NAME()='Dev'EXEC sp_rename ....