我有一个带有一些视图的数据库项目。
视图的行为应根据发布的环境而有所不同。
发布到开发环境时,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
答案 0 :(得分:1)
首先,您应该删除此要求,并在所有数据库中使用相同的代码。你几乎100%保证在某些方面犯了一个错误,并部署一些在不同环境中不起作用的东西。
如果您确实想这样做,可以使用同义词 - 在您的视图中引用同义词并指向相应的模式。您不能直接指向架构的同义词,但可以使用架构中的对象,如果您有:
create synonym Hub.table for devSchema.table
然后你的视图引用Hub.table,它将被解析为开发表。
答案 1 :(得分:0)
有一个生成SQL脚本的T4模板
模板中的找出你正在运行的环境......相应地创建输出
找出生成输出所需的环境,查看发布配置文件和配置特定变量(又名&#34;条件编译符号&#34;在项目的构建属性中)< / p>
您可以在T4模板中探测那些
答案 2 :(得分:0)
您不能在架构或对象名称中使用变量。如果你真的想达到你所说的话,我可以建议你两种方式:
您不会使用变量控制它,但您可以使用发布配置来控制它。您可以在sqlproj文件中使用条件语句。所以,我创建了2个视图:
创建视图[HUB]。[查看1] AS SELECT 1为一个;
创建视图[ISA]。[查看1] AS SELECT 1为一个;
然后在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' " />
注意:您需要在构建中包含和排除相同的文件才能实现该目标。
这是一种更简单的方法。始终使用相同的方法创建视图,并将其移动到发布脚本中的正确模式。例如:
IF DB_NAME()='Dev'EXEC sp_rename ....