有没有办法在没有连接字符串的情况下调用 SSDT DacServices

Is there a way to call SSDT DacServices without a connectionstring

我有一个 Source DacPac 和一个 Target DacPac。使用 powershell 我想比较两者并生成升级脚本。只要存在有效的连接字符串,这本身对于 DacServices 的所有情况都很简单。但是,对于我的 CD 管道,我不知道最终的连接字符串,我也不希望知道。我想要的只是让脚本生成 SQL。

我用 sqlpackage.exe 尝试了这个,方法是发送如下参数

$args = @( "/a:Script", "/sf:$PathToDacpacSource", "/tf:$PathToDacpacTarget", "/op:$outputFile", "/tdn:$TargetDatabaseName" )

这很好用。到目前为止,我通过 [Microsoft.SqlServer.DacFx.x64] 只添加了对 DacServices 的依赖,但是没有连接字符串就无法生成脚本,这迫使我通过 [[=] 添加了对 SQLPackage.exe 的依赖29=]] 也是

DacServices 的构造函数都需要 ConnectionString

有没有人遇到过类似的情况,有什么解决办法吗?

或者您是否在部署端专门使用 SQLPackage 来解决这个问题?

有一个静态版本的 GenerateDeployScript 不需要连接字符串,因为您不需要为静态方法调用构造函数,在 msdn 文档中不是很清楚,但是 "S"看起来它是浮动的意味着它是静态的:)

https://msdn.microsoft.com/en-us/library/microsoft.sqlserver.dac.dacservices.generatedeployscript(v=sql.120).aspx#M:Microsoft.SqlServer.Dac.DacServices.GenerateDeployScript%28Microsoft.SqlServer.Dac.DacPackage,Microsoft.SqlServer.Dac.DacPackage,System.String,Microsoft.SqlServer.Dac.DacDeployOptions%29

` public static string GenerateDeployScript( DacPackage sourcePackage, DacPackage targetPackage, string targetDatabaseName, DacDeployOptions options = null )