web-dev-qa-db-ja.com

SQL Server Insert Into-切り捨てエラーの原因となっている列を特定する方法

テーブルに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を使用しています。

より簡単な代替手段はありますか?

11
Juan Velez

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を使用してそのタイプの切り捨てを無視できます。

3
user14472

残念ながら、あなたは かなり古い "機能"に遭遇しました。コネクトチケットは2008年から公開されており、ほぼ10年間、これは修正を保証するほど重要ではありません。

標準の回避策 は、あなたが考えたように、select into...に続いて、テーブルのメタデータを比較します。別の可能性は、問題の列をバイナリ検索することですが、それも手作業です。メタデータの比較にはいくつかのハックがありますが、シンプルでエレガントなソリューションは存在しません。サードパーティのツールが役立つかもしれませんが、私はそのことを知りません。

9
vonPryz

(QUERYTRACEON 460)をクエリの最後に置くと機能しませんでした。

私はそれをDBレベルでオンにして、うまくいきました:

DBCC TRACEON(460, -1);
GO

ただし、問題を見つけて修正したら、オフにしてください。オンのままにしないでください。

DBCC TRACEOFF(460, -1);
GO
1
Taylor Brown