为何SSMS查询设计器自动添加COLLATE SQL_Latin1_General_CP1_CI_AS?
SSMS查询设计器自动添加COLLATE子句与别名的解决办法
问题场景
上周起,使用SSMS查询设计器构建查询时,部分列被自动追加COLLATE SQL_Latin1_General_CP1_CI_AS并强制设置别名(如Expr1、Expr2)。此前近两个月未出现该问题,仅修改过显示行号设置,恢复默认设置后问题仍存在。
初始可正常运行的查询:
SELECT TOP (1000) [site_ref] ,[trans_num] ,[acct] ,[trans_date] ,[dom_amount] ,[ref] ,[vend_num] ,[voucher] FROM [dbo].[ledger_mst]
经查询设计器转换后变为:
SELECT TOP (1000) site_ref COLLATE SQL_Latin1_General_CP1_CI_AS AS Expr1, trans_num, acct COLLATE SQL_Latin1_General_CP1_CI_AS AS Expr2, trans_date, dom_amount, ref COLLATE SQL_Latin1_General_CP1_CI_AS AS Expr3, vend_num COLLATE SQL_Latin1_General_CP1_CI_AS AS Expr4, voucher COLLATE SQL_Latin1_General_CP1_CI_AS AS Expr5 FROM dbo.ledger_mst
解决步骤
1. 调整查询设计器冲突解决设置
打开SSMS,依次进入工具 → 选项 → 查询设计器 → SQL Server查询设计器,取消勾选以下两个选项:
- 自动解决排序规则冲突
- 自动解决类型转换冲突
修改后重启SSMS,再测试查询设计器的行为。
2. 重置SSMS用户配置
若上述设置无效,可能是用户配置文件损坏:
- 关闭所有SSMS窗口
- 打开命令提示符,执行:
devenv.exe /resetuserdata
注意:该操作会重置SSMS所有自定义设置(包括布局、快捷键等),操作前可备份必要配置。
3. 检查列与数据库的排序规则一致性
查询设计器自动添加COLLATE通常是因为列的排序规则与数据库/服务器默认规则存在冲突。可通过以下SQL查看目标列的排序规则:
SELECT name AS column_name, collation_name FROM sys.columns WHERE object_id = OBJECT_ID('dbo.ledger_mst') AND name IN ('site_ref','acct','ref','vend_num','voucher');
若列排序规则与数据库默认规则不一致,可根据业务需求统一排序规则(需注意数据兼容风险)。
4. 修复或重装SSMS
如果以上方法均无效,可能是SSMS安装文件损坏:
- 打开控制面板的程序和功能,找到Microsoft SQL Server Management Studio
- 选择更改 → 修复,完成后重启SSMS
- 若修复无效,可卸载后重新安装对应版本的SSMS
内容的提问来源于stack exchange,提问作者Crystal
相关产品推荐
相关产品推荐

