2016-08-01 4 views
0

Sql Server Bulkinsertを使用して、夜間に静かに実行されるスケジュールされたジョブを通じて、XMLファイルからDBに大量のデータをアップロードしています。ゾンビレコードを一括して挿入できますか?

背景

このダミーモデル考えてみましょう:

+====================+  +====================+ 
+ INVOICE   +  + INVOICE LINES  + 
+====================+  +====================+ 
+ PK + InvoiceId  +-I-┐ + PK + InvoiceLineId + 
+ + ...   + └IX-+ FK + InvoiceId  + 
+ + ...   +  + + ...   + 
+====================+  +====================+ 

を私のソースは、信頼性の高いデータを私に提供することが期待されていますが、ミス/エラーが起こるのか。 Invoice LinesInvoiceId FKは、Invoiceに存在しないInvoiceIdを指している可能性があります。

私の質問

はBulkinsert原因ゾンビのレコードを間違って参照されるデータを供給することはできますか?

制約を再度オンにすると、それらを挿入すると(ログ可能)警告が表示されますか?

もしそうなら、これらはヒト検出可能であろう。アップロード後のクリーンアップを作成することができました。アップロード前の小切手は非常に複雑で、私の責任ではありません。彼らは、依存関係への参照を持っている ので、存在する理由がない、データベースに格納され

レコード、経由:私はゾンビレコードで何を意味するかに余分明確にする

PS

外部キー は存在しない別のテーブルにあります。

私が知っている限り、これは一般的に受け入れられている用語です。

+0

と悪い行を検出することができますか? – TheGameiswar

+2

最も簡単なことは、NOT EXISTSを使用して監査レポートを実行して事前にこれらを見つけることです。 FK制約を有効にしても、壊れた制約のリストは表示されませんが、単純なSELECTが使用されます。あなたはこれらの悪い記録をどうしますか?チェックや削除のために人間に転送する? –

+0

制約を元に戻すと、制約は失敗します。 – TheGameiswar

答えて

1

CHECK_CONSTRAINTSオプションが

CHECK_CONSTRAINTSが指定されていない場合は、[はい、それは、(あなたがそれを置くよう「ゾンビレコード」)以外の既存のINVOICEを参照INVOICE LINES行を引き起こす可能性がありますが、ターゲット表 上のすべての制約を指定しますか、一括インポート操作中にビューをチェックする必要があります。 CHECK_CONSTRAINTSオプションが指定されていない場合、CHECKおよびFOREIGN KEY制約はすべて無視され、操作後はテーブルの制約は が信頼されていないとマークされます。

https://msdn.microsoft.com/en-us/library/ms188365.aspx

あなたはゾンビレコードが何ポスト負荷クエリ

SELECT * 
FROM [INVOICE LINES] il 
    WHERE NOT EXISTS (
    SELECT 1 FROM INVOICE i WHERE i.InvoiceId =il.InvoiceId) ;