【发布时间】:2020-09-11 18:40:33
【问题描述】:
我有一个数据集,想将其导入我的数据库,条件是:
- 如果有记录无法导入,可以提取到日志中
- 虽然无法导入现有记录但仍允许导入可导入的记录(其他记录)并继续处理
目前我使用 BCP 实用程序将数据从 csv 文件导入到表中:
bcp table_name IN C:\Users\09204086121\Desktop\data.csv -T -c -o C:\Users\09204086121\Desktop\logOut.log -e C:\Users\09204086121\Desktop\errOut.log
它只是满足我上面的条件1。 我需要当记录有错误时(重复主键,...),写入日志(1)并继续将其他正常记录插入表中(2)。
我想出了将触发器与bcp结合的想法,在创建触发器并将参数-h "FIRE_TRIGGERS"添加到bcp语句后,插入将忽略具有相同键但不会写入日志的记录.
这是我的触发器。
ALTER TRIGGER [PKGORDERCOMMON].[T_ImportData] ON [PKGORDERCOMMON].[IF_R_BUNRUI1]
INSTEAD OF INSERT
AS
BEGIN
--Insert non duplicate records
INSERT INTO [IF_R_BUNRUI1]
(
SYSTEM_KB,
BUNRUI1_CD,
BUNRUI1_KANJI_NA,
BUNRUI1_KANA_NA,
CREATE_TS
)
SELECT SYSTEM_KB,
BUNRUI1_CD,
BUNRUI1_KANJI_NA,
BUNRUI1_KANA_NA,
CREATE_TS
FROM inserted i
WHERE NOT EXISTS
(
SELECT *
FROM [IF_R_BUNRUI1] c
WHERE c.BUNRUI1_CD = i.BUNRUI1_CD
AND c.SYSTEM_KB = i.SYSTEM_KB
);
END;
有没有人可以帮助我。
【问题讨论】:
-
那么你的问题是什么?
-
嗨,为什么不添加具有此约束的唯一约束对(BUNRUT1_CD,SYSTEM_KB),您不必添加此触发器..
-
@Sanpas 唯一约束只会防止重复,但也会停止批量复制过程。当然不会记录重复。
-
是的,我明白这一点,但在 bcp 中有一些其他选项(参数,如 '-e "errorfile.txt"') :docs.microsoft.com/en-us/sql/tools/…
-
我想使用 bcp 将数据导入表中。如果记录失败,则写入日志,其他记录将继续插入到表中。如何使用能满足以上2种情况的bcp?
标签: sql-server import triggers bcp