【发布时间】:2013-01-16 17:36:45
【问题描述】:
需要一一读取CSV文件信息。即如果文件中的客户存在于客户表中,则插入详细表中,否则插入错误表中。所以我不能使用批量插入方法。
如何从 CSV 文件中逐一读取记录?如何给路径? 批量插入方法在这里不起作用。
【问题讨论】:
标签: sql sql-server sql-server-2008
需要一一读取CSV文件信息。即如果文件中的客户存在于客户表中,则插入详细表中,否则插入错误表中。所以我不能使用批量插入方法。
如何从 CSV 文件中逐一读取记录?如何给路径? 批量插入方法在这里不起作用。
【问题讨论】:
标签: sql sql-server sql-server-2008
一种选择是使用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),在其上设置触发器并通过批量导入到 ImportTable 来导入到 MyTable。这样您就可以保留触发器,并且只要您导入到ImportTable,您就不需要为每次导入进行任何特殊的设置/过程。
【讨论】:
使用批量插入加载到临时表中,然后逐行处理。
【讨论】:
MERGE 或仅使用INSERT 和UPDATE。
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
【讨论】: