使用sqlpackage.exe发布DACPAC到Azure SQL Database遇CatalogCollation属性错误
解决SqlDatabaseOptions不包含CatalogCollation属性的部署错误
这个问题的核心原因很明确:你使用的sqlpackage.exe版本太旧,不支持Azure SQL Database的CatalogCollation属性,而你用VS2017 SSDT v15.6.0生成的DACPAC已经包含了这个新属性,导致旧版本工具无法识别。
下面是具体的解决步骤:
1. 找到VS2017 SSDT对应的sqlpackage.exe版本
你之前用的是Visual Studio 14.0(VS2015)的sqlpackage(路径里的130对应SQL Server 2016版本),而VS2017的SSDT对应的工具在不同的路径下:
- 一般路径格式:
C:\Program Files (x86)\Microsoft Visual Studio\2017\<你的VS版本,比如Community/Professional/Enterprise>\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\150 - 如果你不确定具体路径,可以在VS2017的安装目录里搜索
sqlpackage.exe,找到版本最高的那个(SSDT v15.6.0对应的工具版本通常是15.x)
2. 验证sqlpackage版本
找到路径后,打开命令提示符运行:
sqlpackage.exe /version
确保版本号在14.0以上,最好和你的SSDT版本匹配(比如15.6.x),这样才能完全支持Azure SQL DB的新特性。
3. 使用正确版本重新执行部署命令
替换掉旧的路径,用新找到的sqlpackage.exe运行部署命令,比如:
"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\150\sqlpackage.exe" /SourceFile:"generated.dacpac" /Action:Publish /TargetServerName:"xxxxxxx.database.windows.net" /TargetDatabaseName:"xxxxxxx" /TargetUser:"xxxxxx" /TargetPassword:"xxxxxxx" /TargetTimeout:120
4. 修复VSTS Azure SQL Database Deployment任务的问题
在VSTS任务中,你需要确保使用的是匹配版本的sqlpackage:
- 任务配置里,找到“SqlPackage.exe location”选项,选择Use latest installed version(如果代理机器上已经安装了正确的SSDT版本)
- 或者手动指定你找到的正确路径
- 作为临时 workaround,也可以在“Additional Arguments”里添加
/p:IgnoreCatalogCollation=True,让工具忽略这个属性,但这只是临时方案,长期来看还是建议使用匹配的工具版本
补充说明
CatalogCollation是Azure SQL Database较新引入的属性,用于控制数据库的目录排序规则,旧版本的sqlpackage(比如130版本)没有对这个属性的支持,所以无法解析SSDT v15.6.0生成的DACPAC文件。确保SSDT和sqlpackage版本一致,就能避免这类兼容性问题。
内容的提问来源于stack exchange,提问作者NeilCampbell
相关产品推荐
相关产品推荐

