2015-12-21 59 views
2

我有一個問題,其中整個表值的數據被刪除。它是一個子表,它包含它自己的主鍵,它的父鍵和一些其他數據的外鍵。使用外鍵約束生成插入語句

我嘗試使用合併,從存儲過程中我發現這裏產生: https://github.com/readyroll/generate-sql-merge

這將生成您的整個表的巨型合併聲明。這工作好了一段時間,但我從那以後發現父表中的記錄已經被刪除,並且Merge處理得不好。

我試過重寫它,但是我陷入困境,感覺就像別人以前會做的事情。

我真正喜歡的是生成的INSERT語句1000的與是否存在上述每一個說

IF NOT EXISTS (select PK from ChildTable where ID = <about to be inserted>) AND EXISTS (select FK from ParentTable where ID = <about to be inserted>) 
    INSERT RECORD 
    OUTPUT PK TO LOG TABLE 

即使世界約20,000條記錄,以便其真正的東西,我不希望有辦法手動完成,並且由於刪除事件在幾個月內發生了幾次,我需要從幾個不同的數據庫中生成數據以重新創建整個圖片。

我想將插入的ID保留在日誌表中,以便我可以告訴插入的內容,因此可以出於任何原因將數據恢復到規定狀態。

我的方法的任何意見也是受歡迎的。

謝謝:)

+0

你不知道該怎麼做?生成INSERT語句只是簡單的字符串構建。有什麼理由比這更復雜嗎? –

+0

它之所以如此複雜的原因是因爲我產生的插入體積龐大。 20000插入與相應的IFs等是粉碎我的電腦,SQL不會處理它。 – stugray

回答

0

所以長話短說就是我嘗試了一些方法來解決這個問題,最好的是產生了使用SQL腳本生成的表中插入語句,並把它們放入一個臨時表。因爲我只想導入90%的數據,並根據幾個條件排除特定的記錄,所以我原本以爲我應該用IF來包裝每個插入,但是在嘗試創建查詢計劃時會有20000個IF中斷。

相反,我將沒有過濾器的所有記錄插入臨時表中。然後,我用幾個Delete語句刪除了我不希望從該表中刪除的所有記錄。

最後,我對臨時表中的所有剩餘數據表示,將其插入實際正確的表中,其中數據最初是從中丟失的。

這很好,SQL管理器能夠運行而不會崩潰。這也是我所做的更清晰的事情,並且我不必在字符串構建器中添加大量複雜的IF。

我還在插入時使用了OUTPUT來記錄我插入的所有記錄ID,以便根據需要提供審計線索。

至於字符串生成器,查詢太長而且很複雜,而Excel呻吟約256個字符的限制,我最終使用20 +列連接26列數據後建立我的查詢。當我在Excel中使用自動公式拖動功能時,它會讓我的機器碰撞這麼多的記錄,並且我有一臺非常糟糕的機器!

使用腳本生成,而不是字符串生成器也有不改變數據的好處。它像是喜歡的,所以奇怪的人物和新線等是沒有問題的。