Sql-Server
擴展事件歸類解決錯誤
嘗試在擴展事件下擴展會話時,我在 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
這似乎是實例(即伺服器)級排序規則和
[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
使用方法更新實例的排序規則- 重新附加使用者數據庫