需要一一读取CSV文件信息。即如果文件中的客户存在于客户表中,则插入明细表,否则插入错误表。所以我不能使用批量插入方法。
如何从 CSV 文件中逐一读取记录?如何给路径?批量插入方法在这里不起作用。
需要一一读取CSV文件信息。即如果文件中的客户存在于客户表中,则插入明细表,否则插入错误表。所以我不能使用批量插入方法。
如何从 CSV 文件中逐一读取记录?如何给路径?批量插入方法在这里不起作用。
一种选择是使用INSTEAD OF INSERT
触发器选择性地将行放入正确的表中,然后使用您的正常BULK INSERT
选项FIRE_TRIGGERS
。
接近的东西;
CREATE TRIGGER bop ON MyTable INSTEAD OF INSERT AS
BEGIN
INSERT INTO MyTable
SELECT inserted.id,inserted.name,inserted.otherfield FROM inserted
WHERE inserted.id IN (SELECT id FROM customerTable);
INSERT INTO ErrorTable
SELECT inserted.id,inserted.name,inserted.otherfield FROM inserted
WHERE inserted.id NOT IN (SELECT id FROM customerTable);
END;
BULK INSERT MyTable FROM 'c:\temp\test.sql'
WITH (FIELDTERMINATOR=',', FIRE_TRIGGERS);
DROP TRIGGER bop;
如果您定期导入文件,您可以创建一个具有相同架构的表 (ImportTable),在其上设置触发器并MyTable
通过批量导入到ImportTable
. 这样您就可以保留触发器,并且只要您要导入到ImportTable
,就不需要为每次导入执行任何特殊的设置/过程。
使用批量插入加载到临时表中,然后逐行处理它。
CREATE TABLE #ImportData
(
CVECount varchar(MAX),
ContentVulnCVE varchar(MAX),
ContentVulnCheckName varchar(MAX)
)
BULK INSERT #ImportData
FROM 'D:\test.csv'
WITH
(
FIRSTROW = 2,
FIELDTERMINATOR = ',', --CSV field delimiter
ROWTERMINATOR = '\n', --Use to shift the control to next row
TABLOCK
)
select * from #ImportData
//Here you can write your script to user read data one by one
DROP TABLE #ImportData