Azure Synapse无服务器SQL池数据库项目排序规则冲突求助
解决Azure Synapse Serverless SQL Pool架构对比排序规则冲突问题
问题根源
架构对比工具在构建源模型时,会读取master数据库的系统视图(比如sys.databases、sys.schemas),这些视图的列采用master默认的SQL_Latin1_General_CP1_CI_AS排序规则,而你的用户数据库及部署项目使用的是Latin1_General_100_BIN2_UTF8,两类元数据在UNION合并时触发了排序规则冲突。
可行解决方案
1. 配置数据库项目的SQLCMD变量与默认规则
在Visual Studio数据库项目中:
- 右键项目 → 选择「属性」→ 切换到「SQLCMD变量」标签
- 添加变量
DefaultCollation,赋值为Latin1_General_100_BIN2_UTF8 - 进入「数据库设置」标签,确认排序规则已设为目标规则,同时勾选「在生成脚本时使用默认排序规则」
2. 调整架构对比的筛选与规则选项
无论是Visual Studio还是Azure Data Studio的对比工具:
- 启动对比前,打开「选项」设置
- 在对象筛选中,排除master库的系统对象(如
sys、information_schema下的所有对象) - 若有「忽略排序规则差异」选项,直接启用该功能
3. 显式指定对象级排序规则
对项目中创建的表、视图等对象,所有字符类型列显式声明排序规则,避免继承冲突:
CREATE TABLE dbo.Customer ( CustomerID INT IDENTITY(1,1) PRIMARY KEY, CustomerName NVARCHAR(100) COLLATE Latin1_General_100_BIN2_UTF8 NOT NULL );
4. 绕过架构对比,直接生成部署脚本
如果以上方法仍无效,直接用项目生成部署脚本执行:
- 在Visual Studio中右键项目 → 「生成」,找到输出的
.dacpac文件 - 使用
SqlPackage.exe生成指定排序规则的部署脚本:
SqlPackage.exe /Action:Script /SourceFile:YourLakehouseProject.dacpac /TargetConnectionString:"Server=tcp:<your-synapse-workspace>.sql.azuresynapse.net,1433;Database=<your-serverless-db>;Authentication=Active Directory Integrated;" /p:DefaultCollation=Latin1_General_100_BIN2_UTF8
内容的提问来源于stack exchange,提问作者Ziad Salem
相关产品推荐
相关产品推荐

