現象
Microsoft SQL Server 2014、2016、および 2017 の CHAR または VARCHAR 列に対して連結などの文字列操作を実行するクエリがあるとします。 たとえば次のようなシナリオを考えてみます。
- 複数の列に割り当てられたさまざまな照合順序で列を連結します。
- これらの照合順序は互いに互換性がありません。 たとえば、Latin1_General_CI_AIとして照合された列を Latin1_General_BIN と連結しようとします。
- 連結の最終結果は、照合順序の競合解決の問題として、特定の照合順序 ("database_default" を含む) に割り当てられます。
このシナリオでは、SQL Server から "照合順序なしによる無効な比較" というリテール アサートが返される場合があり、次のようなエラー メッセージが表示される場合があります。
注
場所: typinfo.cpp:LineNumber
式: false
SPID: SPID
プロセス ID: ProcessID
説明: 照合順序がないため比較が無効です。メッセージ 3624、レベル 20、状態 1、行 LineNumber
システム アサーション チェックに失敗しました。 詳細については、SQL Server エラー ログを確認してください。 通常、アサーション失敗はソフトウェアのバグまたはデータの破損によって発生します。 データベースの破損をチェックするには、DBCC CHECKDB の実行を検討してください。 セットアップ中にダンプを Microsoft に送信することに同意した場合は、ミニ ダンプが Microsoft に送信されます。 更新プログラムは、Microsoft から最新の Service Pack で入手できるか、テクニカル サポートから提供される修正プログラムで入手できる場合があります。メッセージ 596、レベル 21、状態 1、行 LineNumber
セッションは kill 状態であるため、実行を続行できません。メッセージ 0、レベル 20、状態 0、行 LineNumber
現在のコマンドで重大なエラーが発生しました。 結果がある場合は破棄する必要があります。
原因
クエリの最適化ステージでは、SQL Server はクエリのさまざまなステージの中間結果 (連結など) のカーディナリティの計算を試みます。 照合順序の競合の解決は最後に行われるため、クエリ オプティマイザーはそのことに気づかない可能性があり、競合する照合順序のある入力に対して連結カーディナリティの計算を実行しようとします。
解決策
この問題は、次の SQL Server の累積的な更新プログラムで修正されています。
SQL Server 2016 SP1 の累積的な更新プログラム CU 38
SQL Server 2017 の累積的な更新プログラム CU 38
SQL Server 2014 SP2 の累積的な更新プログラム 9
SQL Server の累積的な更新プログラムについて:
SQL Server 用の新しい累積的な更新プログラムには、以前の累積的な更新プログラムに含まれていたすべての修正プログラムとすべてのセキュリティ修正プログラムが含まれています。 SQL Server の最新の累積的な更新プログラムを確認してください。
SQL Server 2016 の最新の累積的な更新プログラム
SQL Server 2017 の最新の累積的な更新プログラム
SQL Server 2014 の最新の累積的な更新プログラム
状態
Microsoft は、これが "適用対象" セクションに記載されている Microsoft 製品の問題であることを確認しました。
参考資料
マイクロソフトでソフトウェア更新プログラムの説明に使用する用語集を参照してください。