从CSV文件使用批量插入时修改和检查数据 - SQL

时间:2016-06-24 15:16:18

标签: sql-server csv bulkinsert

我正在使用以下方法将数据从csv文件插入SQL。

BULK
INSERT tblMember
FROM 'F:\target.txt'
WITH
(
DATAFILETYPE='widechar',
CODEPAGE = 'ACP',
FIELDTERMINATOR = ';',
ROWTERMINATOR = '\n',
ERRORFILE = 'C:\CSVDATA\ErrorRows.csv',
)
GO

我需要做两件事。首先检查每行的CSV文件的第一列中的所有字符是否仅为数字,如果是,则插入它。此外,我需要在插入这些字符之前添加特定的Word。

01 - 123,M,A,USA
02 - H24,N,Z,USA

我只需要插入第一行,因为第一列只有数字'123',我需要在这个数字之前添加“D”,然后将其插入到SQL中。所以我们在插入后会有这样的SQL:

"D123","M","A","USA"

可能的?

1 个答案:

答案 0 :(得分:1)

让我们考虑一个包含四行数据的示例CSV(在C盘中)文件target-c.txt。(注意我使用target-c.txt而不是target.txt

123,M,A,USA
H24,N,Z,USA
H25,N,V,USA
456,M,U,USA

现在创建一个名为targetFormat.fmt的非XML格式文件(在C盘中)。并按以下方式填充文件

9.0  
4  
1       SQLCHAR       0       100     ","     1     Col1               SQL_Latin1_General_CP1_CI_AS  
2       SQLCHAR       0       100     ","     2     Col2               SQL_Latin1_General_CP1_CI_AS  
3       SQLCHAR       0       100       ","     3     Col3               ""  
4       SQLCHAR       0       100     "\r\n"  4     Col4               SQL_Latin1_General_CP1_CI_AS 

请注意此格式化。如果您想了解有关非XML格式文件的更多信息,请单击此Link。基本示例如下。 enter image description here 请根据需要更改格式文件。(如DataType,ChaterLength等)

我创建了一个示例表tblMember(请根据您的方式更改,例如列名,数据类型等。请记住,您还必须更改targetFormat.fmt文件)

CREATE TABLE tblMember   
   (  
   Col1 nvarchar(50),  
   Col2 nvarchar(50) ,  
   Col3 nvarchar(50) ,   
   Col4 nvarchar(50)   
   );  

然后根据您的方式使用以下查询批量插入(在Col1前面添加一个字符“D”,带整数值

INSERT INTO tblMember(Col1,Col2,Col3,Col4)  
(
select 'D'+t1.Col1 AS Col1,t1.Col2,t1.Col3,t1.Col4 
from openrowset(bulk 'C:\target-c.txt'
        , formatfile = 'C:\targetFormat.fmt'
        , firstrow = 1) as t1
where  t1.Col1  not like '%[^0-9]%' --Not Like Letter Number mixed (123, 456)
UNION 
select t1.Col1,t1.Col2,t1.Col3,t1.Col4 
from openrowset(bulk 'C:\target-c.txt'
        , formatfile = 'C:\targetFormat.fmt'
        , firstrow = 1) as t1
where  t1.Col1   like '%[^0-9]%'--Like Letter Number mixed (H24, H25)
)

现在,如果你选择你的桌子,你会得到这个(我已经尝试过并且工作正常) enter image description here

以下是您的回答如果您愿意,可以订购该列。它非常简单,只需将查询放在第一个括号中,然后根据自己的方式对其进行排序或格式化。