テーブルに650のフィールドを挿入するストアドプロシージャがあります。挿入は切り捨てエラーで失敗します。
簡単です
INSERT INTO
SELECT (a bunch of fields)
FROM (a bunch of tables)
以下はエラーメッセージです。
メッセージ8152、レベル16、状態14、プロシージャDSP_Procedure、行1075文字列またはバイナリデータは切り捨てられます。
切り捨てエラーの原因となっているフィールドをすばやく特定できる方法はありますか?
テーブルに挿入される選択ステートメントに650のフィールドがあるため、どのフィールドが切り捨てエラーの原因であるかを正確に特定することが困難です。
SP一度に100個のフィールドを挿入してからSPを実行するように、一度にフィールドのブロックをコメントアウトできると思います切り捨てエラーの原因となっているフィールドを含む100フィールドのグループに少なくとも絞り込むことができるまで、6または7回の異なる時間。
または、たぶんSELECT INTO
新しいテーブルを作成してから、テーブルのデータ長と、挿入しようとしているターゲットテーブルのデータ長を比較しますSP予想よりも長いフィールドが含まれているフィールドを確認します長さ...
SQL Server 2014を使用しています。
より簡単な代替手段はありますか?
SQL Server 2016(SP2、CU6以降)を使用している場合、1つのオプションはトレースフラグ460をオンにすることです。 (QUERYTRACEON 460)
。出力には、列と問題のデータが示されます。
詳細については、この記事を参照してください。 https://www.brentozar.com/archive/2019/03/how-to-fix-the-error-string-or-binary-data-would-be-truncated/
切り捨てを気にしない場合は、SET ANSI_WARNINGS OFF
を使用してそのタイプの切り捨てを無視できます。
(QUERYTRACEON 460)をクエリの最後に置くと機能しませんでした。
私はそれをDBレベルでオンにして、うまくいきました:
DBCC TRACEON(460, -1);
GO
ただし、問題を見つけて修正したら、オフにしてください。オンのままにしないでください。
DBCC TRACEOFF(460, -1);
GO