Lickrob Asked: 2019-12-13 00:57:27 +0800 CST2019-12-13 00:57:27 +0800 CST 2019-12-13 00:57:27 +0800 CST 扩展事件排序规则解析错误 772 尝试在扩展事件下扩展会话时,我在 SSMS 18.2 (15.0.18142) 中收到归类解析错误: 查看跟踪,我发现这个查询是给我排序错误的原因,但我不明白为什么?所有系统数据库都具有相同的排序规则 SELECT * FROM sys.server_event_sessions AS session LEFT OUTER JOIN sys.dm_xe_sessions AS running ON running.name = session.name sql-server sql-server-2016 1 个回答 Voted Best Answer Solomon Rutzky 2019-12-14T00:34:07+08:002019-12-14T00:34:07+08:00 这似乎是实例(即服务器)级排序规则与[master]数据库中使用的排序规则之间的冲突。sys.server_event_sessions和都是sys.dm_xe_sessions系统目录视图,它们的[name]字段排序规则应该是一样的。 sepupic让 OP 执行以下操作: select top 1 sql_variant_property(name, 'collation') from sys.server_event_sessions; select top 1 sql_variant_property(name, 'collation') from sys.dm_xe_sessions; 结果是: sys.server_event_sessions = Latin1_General_CI_AS sys.dm_xe_sessions = SQL_Latin1_General_CP1_CI_AS 这种差异应该是不可能的,但至少它解释了错误消息。 我要求 OP 执行以下操作以确定实例级排序规则: SELECT SERVERPROPERTY('collation'); OP 回复: ...服务器排序规则是“SQL_Latin1_General_CP1_CI_AS”。我的印象是服务器排序规则就是主数据库排序规则。此服务器是从 Microsoft Azure 映像安装的,因此排序规则从 SQL_Latin1_General_CP1_CI_AS 更改为 Latin1_General_CI_AS。 很明显,归类更改过程出了点问题。通过创建一个包含一个表和一个字符串列的数据库,我能够重现该错误。我使用了区分大小写的排序规则,其中一列也是主键(意思是:唯一索引)。我添加了两行:N'A'和N'a'。然后,我使用sqlservr.exe -q全局更新排序规则的方法(详情见下文),将实例的排序规则更改为不同的排序规则,即不区分大小写的排序规则。当进程试图重建 PK 时,它失败了,因为不区分大小写的排序规则使第二行与第一行不同。但是,系统数据库已经更新。但是,实例级排序规则没有更改为新的排序规则,因为该过程从未完成。 要解决此问题,我相信以下方法会起作用: 分离所有用户数据库(以尽量减少操作的影响:用户数据库不是问题,并且某些列可能具有不同的排序规则集,不应更改) sqlservr.exe -q使用方法更新实例的排序规则 重新附加用户数据库
这似乎是实例(即服务器)级排序规则与
[master]
数据库中使用的排序规则之间的冲突。sys.server_event_sessions
和都是sys.dm_xe_sessions
系统目录视图,它们的[name]
字段排序规则应该是一样的。sepupic让 OP 执行以下操作:
结果是:
这种差异应该是不可能的,但至少它解释了错误消息。
我要求 OP 执行以下操作以确定实例级排序规则:
OP 回复:
很明显,归类更改过程出了点问题。通过创建一个包含一个表和一个字符串列的数据库,我能够重现该错误。我使用了区分大小写的排序规则,其中一列也是主键(意思是:唯一索引)。我添加了两行:
N'A'
和N'a'
。然后,我使用sqlservr.exe -q全局更新排序规则的方法(详情见下文),将实例的排序规则更改为不同的排序规则,即不区分大小写的排序规则。当进程试图重建 PK 时,它失败了,因为不区分大小写的排序规则使第二行与第一行不同。但是,系统数据库已经更新。但是,实例级排序规则没有更改为新的排序规则,因为该过程从未完成。要解决此问题,我相信以下方法会起作用:
sqlservr.exe -q
使用方法更新实例的排序规则