【问题标题】:Command-line/API for Schema Compare in SSDT SQL Server Database Project?SSDT SQL Server 数据库项目中架构比较的命令行/API?
【发布时间】:2025-11-22 09:30:01
【问题描述】:

在 Visual Studio 2012 中,我们在 SSDTSQL Server Database Project (DbProject) 项目中有 Schema Compare,这会有所帮助

  1. 比较 sourcetarget
  2. 更新target 使其与source 相同

在哪里

  1. 源和目标可以是数据库、DbProject 项目或 .dacpac 文件
  2. 可以通过更新操作生成的脚本完成更新

我的问题是,有没有可能,我在哪里可以获得命令行/API 接口来调用此功能?

【问题讨论】:

    标签: database api command-line synchronization sql-server-data-tools


    【解决方案1】:

    来源数据库

    sqlpackage.exe /a:Extract /scs:Server=%Server%;Database=AspBaselineDB; /tf:%DriveSpec%\%DacPath%\%AspBaselineDB%_baseline.dacpac

    目标数据库

    sqlpackage.exe /a:Extract /scs:Server=%Server%;Database=%AspTargetDB-2%; /tf:%DriveSpec%\%DacPath%\%AspTargetDB%.dacpac

    比较和生成 Delta 脚本

    sqlpackage.exe /a:Script /sf:%DriveSpec%\%DacPath%\%AspBaselineDB%_baseline.dacpac /tf:%DriveSpec%\%DacPath%\AspNetDb\%AspTargetDB%.dacpac /tdn:aspTargetdb /op:%DriveSpec%\%SqlPath%\AspNetDb\AspDbUpdate.sql

    执行脚本

    sqlcmd.exe -S %Server%\aspnetdbAmexDev -i %DriveSpec%\%SqlPath%\AspNetDb\AspDbUpdate.sql

    我在 CMD 脚本中执行此操作,因为我们的 IT 部门不允许未签名的 PowerShell 脚本并且他们不会购买证书。即使从 TFS 2012 Team Builds 调用它或仅以管理员身份从 VS 命令提示符执行 .CMD 脚本,它也能完美运行。

    注意!

    在您的脚本中添加以下 SET:SET PATH=%PATH%;C:\Program Files (x86)\Microsoft SQL Server\110\DAC\bin

    另外:如您所见,我设置了路径变量。我这样做是因为我正在修改多达 50 种类型的数据库,这是我发现生成增量脚本和更新我们的 DEV 和 TEST 数据库的唯一一致方式。

    【讨论】:

    • 我们也可以比较特定的用户表数据并生成脚本吗?
    • 有没有办法对某个表或项目执行此操作? Visual Studio 和 Update 中的 Schema Compare 将允许人们手动选择,我如何在命令行中执行此操作?
    【解决方案2】:

    目前,获取架构比较结果的 API 访问权限的唯一方法是编写部署计划修改器/执行器,该修改器/执行器在 DacServices API 中的部署/脚本操作期间运行。这使您可以检查在将 dacpac 与数据库进行比较时生成的部署计划,但它还可以访问表示模式比较操作的 ModelComparisonResult,该操作在传递给贡献者的 OnExecute 方法的上下文对象中可用.我刚刚写了一个 blog post 来介绍这个过程,可能对你有用 - 看看它,希望它能帮助你开始。

    【讨论】:

    • 需要一个漂亮的 powershell one liner 来做到这一点:)
    【解决方案3】:

    我不久前就这个话题wrote a few lines。希望它们对您有用。

    简而言之,您正在寻找的工具是 vsdbcmd.exe,它由 Visual Studio 的 Ultimate 和 Premium 版本分发。

    【讨论】:

    • 酷!这似乎是我需要的。
    • 我使用的是 Visual Studio 2012。VSDbCmd.exe 似乎适用于 Visual Studio 2010 对吧?
    • 这里提到的 social.msdn.microsoft.com/Forums/en-US/… 不太可能适用于 Visual Studio 2012
    • SqlPackage 是 vsdbcmd.exe 的更新版本。它具有等效的功能。 @NamG.VU-您在回答先前的回答时说 SqlPackage 无济于事,但在这里您说 vsdbcmd 会?您需要哪些 SqlPackage 没有的确切功能?
    • @Nam 我不知道他们已经从 vs2012 中删除了 vsdbcmd。希望您可以使用乍一看似乎非常相似的 SqlPackage 执行相同的操作和机制 (msdn.microsoft.com/en-us/library/hh550080(v=vs.103).aspx)