数据库项目视图中的动态变量
Dynamic variables in Database Project views
我有一个包含一些视图的数据库项目。
视图的行为应根据它们发布到的环境而有所不同。
发布到开发环境时,INNER JOIN 应该为目标架构名称使用特定前缀,并在测试环境中使用另一个前缀。
有可能实现吗?在下面的代码片段中,id喜欢在本地开发和发布到开发环境时使用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
有一个生成您的 SQL 脚本的 T4 模板
在您的模板中找出您运行反对的环境...相应地创建输出
要找出您需要为哪个环境生成输出,请查看发布配置文件和配置特定变量(a.k.a。"conditional compilation symbols" 在项目的构建属性中)
你可以探查T4模板中的那些
您不能在架构或对象名称中使用变量。如果你真的想实现你所说的,我可以建议你两种方式:
你不会用变量来控制它,但你会用发布配置来控制它。您可以在 sqlproj 文件中使用条件语句。所以,我创建了 2 个视图:
创建视图 [HUB]。[View1]
AS SELECT 1 为一;
创建视图 [ISA].[View1]
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' 执行 sp_rename ....
第一件事是您应该删除此要求并在所有数据库中使用相同的代码。您几乎 100% 肯定会在某个时候犯错,并部署一些在不同环境中不起作用的东西。
如果您确实想这样做,您可以使用同义词来实现 - 在您的视图中引用同义词并将其指向相应的模式。您无法获得直接指向模式的同义词,但可以获取模式中的对象,因此如果您有:
- 开发 table devSchema.table
- 生产 table prodSchema.table
在 dev 中,有一个同义词,如:
create synonym Hub.table for devSchema.table
然后你的视图引用 Hub.table 它将被解析给开发者 table。
我有一个包含一些视图的数据库项目。
视图的行为应根据它们发布到的环境而有所不同。
发布到开发环境时,INNER JOIN 应该为目标架构名称使用特定前缀,并在测试环境中使用另一个前缀。
有可能实现吗?在下面的代码片段中,id喜欢在本地开发和发布到开发环境时使用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
有一个生成您的 SQL 脚本的 T4 模板
在您的模板中找出您运行反对的环境...相应地创建输出
要找出您需要为哪个环境生成输出,请查看发布配置文件和配置特定变量(a.k.a。"conditional compilation symbols" 在项目的构建属性中)
你可以探查T4模板中的那些
您不能在架构或对象名称中使用变量。如果你真的想实现你所说的,我可以建议你两种方式:
你不会用变量来控制它,但你会用发布配置来控制它。您可以在 sqlproj 文件中使用条件语句。所以,我创建了 2 个视图:
创建视图 [HUB]。[View1] AS SELECT 1 为一;
创建视图 [ISA].[View1] 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' 执行 sp_rename ....
第一件事是您应该删除此要求并在所有数据库中使用相同的代码。您几乎 100% 肯定会在某个时候犯错,并部署一些在不同环境中不起作用的东西。
如果您确实想这样做,您可以使用同义词来实现 - 在您的视图中引用同义词并将其指向相应的模式。您无法获得直接指向模式的同义词,但可以获取模式中的对象,因此如果您有:
- 开发 table devSchema.table
- 生产 table prodSchema.table
在 dev 中,有一个同义词,如:
create synonym Hub.table for devSchema.table
然后你的视图引用 Hub.table 它将被解析给开发者 table。