web-dev-qa-db-ja.com

値が列の整合性制約に違反しました

ExcelファイルからSQL Serverデータベースにデータをインポートしようとしています。ログファイルに次のエラーが表示されるため、できません。助けてください。ログのエラーは次のとおりです。

[OLE DB宛先[42]]エラー:OLE DBエラーが発生しました。エラーコード:0x80040E21。 OLE DBレコードが利用可能です。ソース: "Microsoft SQL Native Client" Hresult:0x80040E21説明: "マルチステップOLE DB操作でエラーが発生しました。各OLE DBステータス値を確認します(利用可能な場合)。 「。

[OLE DB Destination [42]]エラー:入力 "OLE DB Destination Input"(55)の入力列 "Copy of F2"(5164)にエラーがありました。返された列のステータスは、「値が列の整合性制約に違反しています。」でした。

[OLE DB宛先[42]]エラー:エラーコード0xC020907Dが発生したため、「入力「OLE DB宛先入力」(55)」が失敗し、「入力「OLE DB宛先入力」(55)」のエラー行の処理に失敗が指定されていますエラー発生時。指定されたコンポーネントの指定されたオブジェクトでエラーが発生しました。

[DTS.Pipeline]エラー:コンポーネント "OLE DB Destination"(42)のProcessInputメソッドは、エラーコード0xC0209029で失敗しました。識別されたコンポーネントがProcessInputメソッドからエラーを返しました。このエラーはコンポーネント固有のものですが、エラーは致命的であり、データフロータスクの実行を停止します。

[DTS.Pipeline]エラー:スレッド "WorkThread0"はエラーコード0xC0209029で終了しました。

[Excelソース[174]]エラー:データフロータスクバッファーに行を追加しようとして、エラーコード0xC0047020で失敗しました。

[DTS.Pipeline]エラー:コンポーネント "Excel Source"(174)のPrimeOutputメソッドは、エラーコード0xC02020C4を返しました。パイプラインエンジンがPrimeOutput()を呼び出したときに、コンポーネントはエラーコードを返しました。障害コードの意味はコンポーネントによって定義されますが、エラーは致命的であり、パイプラインは実行を停止しました。

38
user2840167

通常、Allow Nullsオプションがオフの場合に発生します。

解決:

  1. このエラー/警告の列の名前を見てください。
  2. SSMSに移動して、テーブルを見つけます
  3. その列にヌルを許可する
  4. テーブルを保存する
  5. SSISを再実行します

これらの手順を試してください。それは私のために働いた。

このリンクを参照

57
Faizan Mubasher

データの最後の行の後、Excelから空の行を削除します!

Excelの空の行は依然としてデータと見なされる場合があります。そのため、1つ以上のNULL不可列を含むテーブルにそれらをインポートしようとすると、列の制約に違反します。

解決策:データの最後の行の後も含め、シート上のすべての空の行を選択し、[行の削除]をクリックします。

明らかに、データの一部が実際にテーブルの制約に違反している場合は、データベースのルールに一致するようにデータを修正するだけです。

27
Striver

@FazianMubasherの答えのわずかな代替として、指定された列にNULLを許可する代わりに(これは多くの理由で不可能な場合があります)、ブランチに_条件付き分割タスクを追加することもできますNULLエラーファイルの値、または単に無視する場合:

enter image description here

enter image description here

9
Sheridan

「F2のコピー」列のエラーメッセージに「値は列の整合性制約に違反しました」と表示されているためです。

ターゲット表の値に違反しないようにしてください。許容値、データ型などは質問に記載されていないため、より具体的に回答することはできません。

ダウンボットに対処するために、いいえ、実際には、許可されていない列に何かを入れています。それはcould Faizanが指摘する、NOT NULLableカラムにNULLを入れているが、それはotherの全体のホストであり、元のポスターは決して更新が提供された場合、推測する必要があります。挿入が違反した外部キ​​ー制約がありましたか?たぶん吹き飛ばされたチェック制約がありますか? Excelのソース列に、ターゲット列の日付/時刻データ型に対して有効でないExcelの有効な日付値がある可能性があります。

したがって、具体的な情報を考慮せずに考えられる最善の答えは、「それを破るようなことをしないでください」です。この場合、「F2のコピー」についての何かがターゲット列にとって悪いです。テーブル定義、提供された値などを教えてくださいthen特定の答えができます。

NOT NULLableカラムをNULLableカラムにするように人々に言うのは正しい答えかもしれません。また、人類に知られている最も恐ろしい答えかもしれません。既存のプロセスが「F2のコピー」列に常に値があることを予期している場合、制約をNULLに変更すると、既存のクエリに大混乱が生じる可能性があります。例えば

SELECT * FROM ArbitraryTable AS T WHERE T.[Copy of F2] = '';

現在、Copy of F2は名前が不十分なステータスインジケータであるため、このクエリは新たにインポートされたすべてを取得します。そのデータは次のシステムに送られる必要があります...請求書は支払われます。未処理の行にNULL値を設定できるようにすると、上記のクエリはそれを満たさなくなります。請求書は支払われず、コレクションは建物をレポジトリし、今やあなたは職を失っています。それはすべて、影響分析などをしなかったからです。

7
billinkc

TeradataテーブルまたはビューはNULLを「?」として保存しますSQLはそれを文字または文字列と見なします。これがエラーの主な理由です "値が列の整合性制約に違反しました。"データがTeradataソースからSQL宛先に移植されるとき。解決策1:宛先テーブルがNULLを保持できるようにする解決策2: '?'を変換する宛先テーブルに何らかの値として保存される文字。

1
Mohammed Sadiq

これは、さまざまな理由で発生することがあります。

私の場合、SQLインポートの「レポート」の最後までスクロールすると、「実行後(成功)」という見出しの下に、コピーされた行数が表示されます。通常、問題があるのはシートの次の行です。また、インポートメッセージ(どの場合は "F2のコピー")によってどの列がわかるかを確認できるため、通常はExcelで問題のセルがどれであるかがわかります。

これは、Excelの日付形式が前の行と異なるなど、非常にばかげた理由で発生しました。たとえば、セルA2は「05/02/2017」で、A3は「5/2/2017」または「05-02-2017」です。インポートは、物事が完全に一貫していることを望んでいるようです。

Excelの形式が異なる場合も発生するため、B2が「512」でExcelの「数値」形式で、B3が「512」でExcelの「テキスト」形式の場合、セルでエラーが発生します。

また、Excelシートでデータ行の下にあるすべての「空の」行を文字通り削除しなければならない状況もありました。空のように見えることもありますが、Excelは「空の」データなどを持っていると見なし、インポートもそれらをインポートしようとします。これは通常、Excelシートに以前のデータがあり、それをクリアしたが、行を適切に削除していない場合に発生します。

そして、他の人が述べたように、テキスト値を整数列にインポートしようとしたり、NOT NULL列にNULLを挿入しようとしたりする明らかな理由があります。

1
frezq

元のファイルとフィールド/列の値「null」を置き換えることができます。

0
RaRdEvA