P_A*_*_Ar 7 sql sql-server bulkinsert csv-import
我正在尝试将数据从 csv 文件导入到 SQL Server。csv 文件中有数千个条目,并且许多行中的数据不正确。
CSV 文件中的一些行是:
`"ID"|"EmpID"|"FName"|"LName"|"Gender"|"DateOfBirth"
"1"|"90043041961"|"ABCD"|"TEST"|"F"|"1848-05-05 00:00:00.000"
"1"|"10010161961"|"XYZ"|"TEST"|"F"|"1888-12-12 00:00:00.000"
.
.
..
..
....
"4"|"75101141821PPKKLL"|"LLKK"|"F"|"1925-09-09 00:00:00.000"|""
"4"|"32041401961UUYYTT"|"PPLL"|"M"|"1920-01-01 00:00:00.000"|""
.
.....
"25"|"00468132034"|"FGTT"|"OOOO"|"F"|"1922-11-11 00:00:00.000"
"25"|"00468132034"|"KKKK"|"PPPP"|"F"|"1922-11-11 00:00:00.000"
Run Code Online (Sandbox Code Playgroud)
创建 TestTable 并尝试将数据(来自 csv 文件)插入其中:
create table TestTable
(
ID varchar(5),
EmpID varchar(25),
FName varchar(25),
LName varchar(25),
Gender varchar(5),
DateOfirthB varchar(30)
);
Run Code Online (Sandbox Code Playgroud)
我使用以下脚本将数据从 csv 文件导入到TestTableSQL Server 中:
bulk insert TestTable
from 'C:\TestData.csv'
with
(firstrow = 2,
DATAFILETYPE='char',
FIELDTERMINATOR= '"|"',
ROWTERMINATOR = '\n',
ERRORFILE ='C:\ImportErrors.csv',
MAXERRORS = 0,
TABLOCK
);
Run Code Online (Sandbox Code Playgroud)
错误:
消息 4863,级别 16,状态 1,第 1 行
第 32763 行第 5 列(性别)的批量加载数据转换错误(截断)。消息 4863,级别 16,状态 1,第 1 行
第 32764 行第 5 列(性别)的批量加载数据转换错误(截断)。
有没有办法忽略因某种或其他原因而无法添加的行(在 csv 文件中)并插入具有正确语法的行?
谢谢
PS:我无法使用SSIS。只允许使用SQL
我每周都会处理从不同来源收到的不同 CSV 文件,因此其中的数据非常干净,而其他数据则是一场噩梦。这就是我处理收到的 CSV 字段的方法,希望对您有所帮助。您仍然需要添加一些数据验证来处理格式错误的数据。
SET NOCOUNT ON
GO
-- Create Staging Table
IF OBJECT_ID(N'TempDB..#ImportData', N'U') IS NOT NULL
DROP TABLE #ImportData
CREATE TABLE #ImportData(CSV NVARCHAR(MAX))
-- Insert the CSV Data
BULK INSERT #ImportData
FROM 'C:\TestData.csv'
-- Add Control Columns
ALTER TABLE #ImportData
ADD ID INT IDENTITY(1, 1)
ALTER TABLE #ImportData
ADD Malformed BIT DEFAULT(0)
-- Declare Variables
DECLARE @Deliminator NVARCHAR(5) = '|', @ID INT = 0, @DDL NVARCHAR(MAX)
DECLARE @NumberCols INT = (SELECT LEN(CSV) - LEN(REPLACE(CSV, @Deliminator, '')) FROM #ImportData WHERE ID = 1)
-- Flag Malformed Rows
UPDATE #ImportData
SET Malformed = CASE WHEN LEN(CSV) - LEN(REPLACE(CSV, @Deliminator, '')) != @NumberCols THEN 1 ELSE 0 END
-- Create Second Staging Table
IF OBJECT_ID(N'TestTable', N'U') IS NOT NULL
DROP TABLE TestTable
CREATE table TestTable
(ID varchar(4000),
EmpID varchar(4000),
FName varchar(4000),
LName varchar(4000),
Gender varchar(4000),
DateOfirthB varchar(4000));
-- Insert CSV Rows
WHILE(1 = 1)
BEGIN
SELECT TOP 1
@ID = ID
,@DDL = 'INSERT INTO TestTable(ID, EmpID, FName, LName, Gender, DateOfirthB)' + CHAR(13) + CHAR(10) + REPLICATE(CHAR(9), 1)
+ 'VALUES' -- + CHAR(13) + CHAR(10) + REPLICATE(CHAR(9), 2)
+ '(' + DDL + ')'
FROM
(
SELECT
ID
,DDL = '''' + REPLACE(REPLACE(REPLACE(CSV, '''', ''''''), @Deliminator, ''','''), '"', '') + ''''
FROM
#ImportData
WHERE
ID > 1
AND Malformed = 0) D
WHERE
ID > @ID
ORDER BY
ID
IF @@ROWCOUNT = 0 BREAK
EXEC sp_executesql @DDL
END
-- Clean Up
IF OBJECT_ID(N'TempDB..#ImportData', N'U') IS NOT NULL
DROP TABLE #ImportData
-- View Results
SELECT * FROM dbo.TestTable
Run Code Online (Sandbox Code Playgroud)