INSERT、UPDATE時の8152エラーの対応

INSERTやUPDATEの際、テーブルのカラムサイズを超えるデータを入力すると下記のエラーが発生します。

メッセージ8152、レベル16、状態6、プロシージャProcedureName、LineLinenumber
文字列またはバイナリデータは切り捨てられます。

挿入、更新するカラムが多いとどのカラムのデータがエラーなのか分かりづらいときがあります。

そんな時、トレースフラグの460を有効化すると、どのカラムがエラーで、切り捨てられた後の値を表示することができます。

DBCC TRACEON (460, -1);
メッセージ2628、レベル16、状態6、プロシージャProcedureName、行Linenumber
文字列またはバイナリデータは、テーブル '%。* ls'、列 '%。* ls'で切り捨てられます。
切り捨てられた値: '%。* ls'。

DBCC TRACEON – トレース フラグ (Transact-SQL)

https://docs.microsoft.com/ja-jp/sql/t-sql/database-console-commands/dbcc-traceon-trace-flags-transact-sql?view=sql-server-ver15

注: このトレース フラグは、SQL Server 2017 (14.x) CU12 以降のビルドに適用されます。
注: データベース互換性レベル 150 からはメッセージ ID 2628 が既定値となり、このトレース フラグに影響がありません。

KB4468101: SQL Server 2016 および2017の拡張された情報を使って、”文字列またはバイナリデータの代わりに省略可能” というメッセージが表示される

https://support.microsoft.com/ja-jp/topic/kb4468101-sql-server-2016-%E3%81%8A%E3%82%88%E3%81%B32017%E3%81%AE%E6%8B%A1%E5%BC%B5%E3%81%95%E3%82%8C%E3%81%9F%E6%83%85%E5%A0%B1%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6-%E6%96%87%E5%AD%97%E5%88%97%E3%81%BE%E3%81%9F%E3%81%AF%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E4%BB%A3%E3%82%8F%E3%82%8A%E3%81%AB%E7%9C%81%E7%95%A5%E5%8F%AF%E8%83%BD-%E3%81%A8%E3%81%84%E3%81%86%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%8C%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%82%8B-a4279ad6-1d3b-3960-77ef-c82a909f4b89

この改善点は、 SQL Server の次の累積的な更新プログラムに含まれています。
SQL Server 2017 の累積更新プログラム12
SQL Server 2016 SP2 の累積更新プログラム6

SQL Server 2012では、460を有効化しても、2628のメッセージは出力されませんでした。
1レコードの中にカラムサイズを超えるデータが複数あっても、1個しか出力されません。


管理人 has written 34 articles