Applies To
SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Enterprise Core - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2014 Service Pack 2 - duplicate (do not use) SQL Server 2017 Standard on Windows SQL Server 2017 Developer on Windows SQL Server 2017 Enterprise on Windows SQL Server 2017 Enterprise Core on Windows SQL Server 2016 Service Pack 1 SQL Server 2016 Developer - duplicate (do not use) SQL Server 2016 Enterprise - duplicate (do not use) SQL Server 2016 Enterprise Core - duplicate (do not use) SQL Server 2016 Standard - duplicate (do not use)

徵狀

假設您有一個查詢,可在 Microsoft SQL Server 2014、2016和2017的 CHAR 或 VARCHAR 欄上執行某些字串運算(例如,串連)。 請試想下列案例:

  • 您會以不同的排序規則來串連資料行。

  • 這些排序規則與其他排序規則不相容。 例如,您嘗試將分頁的欄串聯成 Latin1_General_CI_AI 與 Latin1_General_BIN。

  • 串連的最終結果會指派給特定的歸類(包括「database_default」),做為歸類衝突解決的問題。

在這種情況下,SQL Server 可能會傳回零售 assert,指出「由於沒有排序規則而造成的比較不正確」,而且您可能會收到如下所示的錯誤訊息:

位置: typinfo:LineNumber 運算式: false SPID: SPID 進程識別碼: ProcessID 描述:由於沒有排序規則,所以比較無效。

Msg 3624、Level 20、State 1、Line LineNumber 系統斷言檢查已失敗。 如需詳細資訊,請參閱 SQL Server 錯誤記錄。 通常,宣告失敗是由軟體錯誤或資料損毀所導致。 若要檢查資料庫是否損毀,請考慮執行 DBCC CHECKDB。 如果您同意在安裝期間將轉儲傳送至 Microsoft,則會將迷你轉儲傳送至 Microsoft。 在最新的 Service Pack 中,或從技術支援取得的修補程式中,可能會有 Microsoft 的更新。

Msg 596、Level 21、State 1、Line LineNumber 無法繼續執行,因為會話處於 [kill] 狀態。

Msg 0、Level 20、State 0、Line LineNumber

目前的命令發生嚴重錯誤。  結果(如果有的話)應該捨棄。

原因

在查詢優化階段中,SQL Server 會嘗試在查詢的各個階段的中間結果上計算 cardinalities,例如,串連。 由於排序規則衝突解決是在最一端進行,因此查詢優化程式可能不知道它,而且會嘗試在具有衝突排序規則的輸入上執行串聯基數的計算。

解決方案

此問題已在 SQL Server 的下列累積更新中修正:

       SQL Server 2016 SP1 的累積更新8  

       SQL Server 2017 的累積更新4

       SQL Server 2014 SP2 累積更新9

每個新的 SQL Server 累計更新都包含所有的修正程式,以及前一個累積更新中所包含的所有安全性修正程式。 查看 SQL Server 的最新累計更新:

SQL Server 2016 的最新累計更新

SQL Server 2017 的最新累計更新

SQL Server 2014 的最新累計更新

狀態

Microsoft 已確認<適用於>一節中所列的 Microsoft 產品確實有上述問題。

參考

瞭解 Microsoft 用於描述軟體更新的 詞彙

Need more help?

Want more options?

探索訂閱權益、瀏覽訓練課程、瞭解如何保護您的裝置等等。