4

我想将一堆记录从临时表复制到目标表。问题是某些记录可能违反目标表中的检查约束,因此我想插入所有可能的内容并在其他地方为无效记录生成错误日志。

如果我执行:

INSERT INTO target_table
  SELECT ... FROM temp_table

如果任何记录违反任何约束,则不会插入任何内容。我可以做一个循环并手动插入,但我认为性能会更低。

4

2 回答 2

7

您可以编写一个存储过程来复制记录并使用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 语言参考中(向下滚动页面,IB 6 文档下载位于底部),在“过程和触发器”一章下。

和上下文变量应该可以帮助您分析错误的确切原因GDSCODESQLCODE

于 2013-02-15T13:20:25.243 回答
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;
于 2013-02-15T12:31:13.883 回答