2013-02-15 38 views
3

我想將一堆記錄從臨時表複製到目標表。問題是有些記錄可能違反目標表中的檢查約束條件,所以我想插入一切可能的內容,並在其他地方爲無效記錄生成錯誤日誌。如何根據Firebird/Interbase中的檢查約束在表間複製記錄?

如果我執行:如果任何記錄違反任何約束

INSERT INTO target_table 
    SELECT ... FROM temp_table 

什麼都不會被插入。我可以做一個循環並手動插入一個,但我認爲性能會更低。

回答

1

像這樣:

INSERT INTO 
    some_table1 (fld1, fld2, fld3) 
SELECT 
    some_table2.fld1, 
    some_table2.fld2, 
    some_table2.fld3 
FROM 
    some_table2 
WHERE 
    some_table2.fld > 100 
LIMIT 
    5; 
6

你可以寫一個存儲過程,而copyes記錄和捕捉任何錯誤與WHEN ANY DO語句,像

CREATE PROCEDURE CopyRecords(...) 
AS 
BEGIN 
    FOR select ... FROM temp_table INTO ... DO BEGIN 
    INSERT INTO target_table ... 
    WHEN ANY DO BEGIN 
     INSERT INTO ErrorLog(SQL_Code, GDS_Code, ...) VALUES(SQLCODE, GDSCODE, ...); 
    END 
    END 
END 

WHEN ... DO語句在InterBase 6.0 Language Reference記錄(滾動在頁面下方,IB 6文檔下載位於底部),位於「程序和觸發器」一章下。

GDSCODESQLCODE上下文變量應該幫助您分析錯誤原因。

+0

除了做一個'INSERT ... SELECT .. WHERE <約束的所有條件>'我認爲這可能是唯一的方法。 – 2013-02-15 16:23:52