簡體   English   中英

從另一個表插入數據時獲取所有約束錯誤

[英]Get all constraint errors when inserting data from another table

我的 Azure SQL 數據庫(Azure SQL 數據庫 12.0.2000.8)中有一個沒有任何約束的臨時表。 我想將 Staging 表中的數據插入到設置了多個約束的“真實”表中。 插入數據時,我使用了這種語句

INSERT INTO <someTable> SELECT <columns> FROM StagingTable;

現在我只在違反某些約束時得到第一個錯誤。 但是,對於我的用例,獲取所有違規很重要,這樣它們就可以完全解決。

我曾嘗試使用TRY...CATCH機制,但是,這將在第一個錯誤上引發錯誤並運行 catch 子句,但它不會繼續處理其他數據。 請注意,不應插入沒有違規的正確數據,因此可以在出現一個錯誤時回滾整個 insert 語句,但是,我希望看到所有違規都能夠更正它們,而無需多次運行 insert 語句獲取所有錯誤的次數。

編輯:需要檢查的約束類型是外鍵約束、非空約束、重復鍵。 不進行轉換,因此無需檢查轉換。

有幾個選項:

  1. 如果要捕獲行級信息,則必須使用游標或 while 循環並嘗試在 TRY CATCH 塊中插入每一行,看看是否有任何錯誤,並記錄相同的信息。

  2. 創建另一個類似於主表(例如 MainCheckTable)並帶有所有約束並禁用所有約束並加載數據的表。

現在,您可以利用 DBCC CHECKCONSTRAINTS 來查看所有違反約束的情況。 閱讀更多內容

USE DBName;
DBCC CHECKCONSTRAINTS(MainCheckTable) WITH ALL_CONSTRAINTS;

首先,不要看你的主表。 查看相關表,例如查找等。首先填充這些表。 一旦您填充了相關表(即)滿足所有相關約束,然后添加數據。

如果有意義,您需要從約束最少的表倒退到約束最大的表。

您應該檢查您的相關表是否具有您打算插入的必需參考值/字段。 這很容易做到,因為您已經有了一個臨時表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM