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


11

テーブルに650のフィールドを挿入するストアドプロシージャがあります。挿入は、切り捨てエラーで失敗します。

簡単です

INSERT INTO
SELECT (a bunch of fields) 
FROM (a bunch of tables)

以下はエラーメッセージです。

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

切り捨てエラーの原因となっているフィールドを簡単に特定できる方法はありますか?

テーブルに挿入される選択ステートメントに650のフィールドがあるため、どのフィールドが切り捨てエラーの原因であるかを正確に特定することが困難です。

一度に100個のフィールドのみを挿入するように、一度にフィールドのブロックをコメント化し、少なくとも100個のフィールドのグループに絞り込むことができるまで、SP 6または7の異なる時間を実行できると思います。切り捨てエラーの原因となっているフィールドが含まれます。

またはSELECT INTO、新しいテーブルを作成して、SPに挿入しようとしているターゲットテーブルのデータ長とテーブルのデータ長を比較して、どのフィールドに予想より長いフィールド長が含まれているかを確認できると考えています。 ..

SQL Server 2014を使用しています。

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


1
INFORMATION_SCHEMA.COLUMNSに移動して、データ型を挿入しようとしているものと比較します。残念ながら、SQLサーバーには、ORACLEのように変数宣言用の動的データ型がありません。
MguerraTorres 2017

2
私は2番目のオプションを使用し、新しい(または#temp)テーブルに挿入してから、列の長さを比較します。または、selectのすべての列をLEN()で囲み、outerqueryでそれぞれに対してMAX()を実行することもできます。これにより、フィールドのテキスト長が最大になります。もちろん、それはあなたに問題を与えているのがcharフィールドであると仮定しています。smalldatetimeまたはtinyintを使用していませんか?
Jonathan Fite 2017

1
「Select Into」アプローチを使用して、列の長さを比較します(はい)。"WHERE 1 = 0"を使用すると、テーブルに行がなくなります。SELECTに選択した列の一意の名前が含まれていない場合は扱いにくいです。列ごとに1行のスクリプトとして長い列リストをフォーマットし、必要に応じて次の行に「AS」列名を、4列の後に空白行を配置して、リスト内に配置しやすくします。これは、多くの行を選択し、Ctrl + K Ctrl + Cを実行してそれらをコメントに変更することもサポートするため、挿入操作をそのように攻撃できますが、省略された列はnull可能である必要があります。
ロバートカーネギー

回答:


3

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


9

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

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


1

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

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

DBCC TRACEON(460, -1);
GO

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

DBCC TRACEOFF(460, -1);
GO
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.