Visual studio 在SSDT中用变量替换数据库名称

Visual studio 在SSDT中用变量替换数据库名称,visual-studio,sql-server-data-tools,Visual Studio,Sql Server Data Tools,我们正在使用SSDT创建一个使用Git和ADO的构建和部署管道。为了构建解决方案,所有跨数据库引用必须在项目中具有相应的数据库引用,并且必须使用[$DatabaseVariable]引用。这意味着每次使用模式比较进行更改和同步时,都必须手动或使用查找和替换来替换数据库名称。当然,find-and-replace方法有许多缺点,包括它将查找和替换项目文件中不应该是数据库变量的引用。我希望有人知道一种自动化这个过程的方法,而不需要像查找和替换这样的暴力方法 我已经到处寻找这个,但没有发现任何有用的东

我们正在使用SSDT创建一个使用Git和ADO的构建和部署管道。为了构建解决方案,所有跨数据库引用必须在项目中具有相应的数据库引用,并且必须使用[$DatabaseVariable]引用。这意味着每次使用模式比较进行更改和同步时,都必须手动或使用查找和替换来替换数据库名称。当然,find-and-replace方法有许多缺点,包括它将查找和替换项目文件中不应该是数据库变量的引用。我希望有人知道一种自动化这个过程的方法,而不需要像查找和替换这样的暴力方法

我已经到处寻找这个,但没有发现任何有用的东西

下面是一个包含跨数据库引用的示例视图:

创建视图[迁移].[vwCHILDS\u声明\u声明] 像 以src为例 选择 强制转换为nvarchar50 CEAllegationIdentifier ,从[$CWNS\u Migration].Allegation.AllegationType中选择AllegationTypeId,其中代码=dfrvmi1.DestinationDataFieldReferenceValueCode AllegationTypeId ,cast1作为int SourceSystemId ,castsrc.IDNBR作为nvarchar64 SourceSystemIdentifier ,src.IDNBR SourceSystemIdentifier\u Numeric ,当src.CRET_DT_TM='0001-01-01'时为空,否则src.CRET_DT_TM end SourceSystemCreatedDateTime ,当src.MOD_DT_TM='0001-01-01'时为空,否则src.MOD_DT_TM end SourceSystemModifiedDateTime , 选择 maxpe.PersonId 从…起 [$CWNS\u Migration].PersonIdentity.PersonIdentifier pe 在castst.FK\u STAFFFK\u PERSID上加入[$CHILDSDB2].VLCHA.STAFF\u USERID st作为nvarchar64=pe.Identifier 和pe.PersonIdentificationSystemId=4 哪里 st.USERID=ltrimrtrimsrc.MOD_USR_ID SourceSystemModifiedPersonId 从…起 [$CHILDSDB2].VLCHA.ALGTN src 左联接[$DataCatalog].dbo.DataFieldReferenceValueMappingInfo dfrvmi1上的dfrvmi1.SourceDataFieldReferenceValueDataFieldId=216 和dfrvmi1.SourceDataFieldReferenceValueCode=ltrimrtrimsrc.FK_ALGTN_PRIORICTG 和dfrvmi1.DestinationDataFieldReferenceValueDataFieldId=20605 选择 src* 从…起 src 左连接[$CWNS\u Migration].Allegation.Allegation tgt on tgt.SourceSystemId=src.SourceSystemId和tgt.SourceSystemIdentifier=src.SourceSystemIdentifier 左连接[$CWNS\u Migration].quantial.Allegation q on q.SourceSystemId=src.SourceSystemId和q.SourceSystemIdentifier=src.SourceSystemIdentifier q.QExecutionId=1 哪里 q、 QExecutionId为空 和 isnullsrc.AllegationTypeId,0 isnulltgt.AllegationTypeId,0 或者将isnulltry\u castsrc.SourceSystemCreatedDateTime作为日期时间,isnulltgt.SourceSystemCreatedDateTime, 或者将isnulltry\u castsrc.SourceSystemModifiedDateTime作为日期时间,isnulltgt.SourceSystemModifiedDateTime, 或isnullsrc.SourceSystemModifiedPersonId,0 isnulltgt.SourceSystemModifiedPersonId,0
我还希望有一种方法可以避免模式比较总是将变量显示为与数据库的差异。

理想情况下,您需要包括所有数据库作为项目的引用右键单击项目并添加数据库引用,或者类似的内容。您可以通过两种方式实现这一点: *为每个数据库创建项目,并导入所有或仅导入数据库正在使用的对象 *从实时数据库中提取dacpac并将其用作参考

然后为主数据库中的每个跨数据库对象创建同义词。例如,如果我们有object[$CWNS\u Migration].PersonIdentity.PersonIdentifier,那么您需要将同义词创建为

CREATE SYNONYM PersonIdentity.PersonIdentifier
    FOR [$(CWNS_Migration)].PersonIdentity.PersonIdentifier;
然后在代码中使用PersonIdentity.PersonIdentifier 2部分名称,而不是3-4部分名称。这就是项目设置

现在,当您右键单击项目并执行发布时,它将弹出对话框,您可以在其中指定CWNS_迁移变量的值,并将其更改为您需要的任何值。之后,您可以选择将此设置另存为,保存的结果称为发布配置文件。因此,对于每个环境,您只需要创建不同的发布配置文件,并在发布更改时使用它


您可能想先尝试使用同义词,可能需要验证才能使用,但我还是建议添加数据库引用。

为每个远程对象创建同义词您需要为每个这样的数据库添加引用并通过发布配置文件更改变量名我不确定我是否了解发布配置文件。我是SSDT的新手。你有没有一个链接来解释怎么做?