我在这里有一些SQL会引发错误:
DROP TABLE HACP_TEMP_PIC_HCV_Imported;
CREATE TABLE HACP_TEMP_PIC_HCV_Imported
(
HeadSSN varchar(255) NOT NULL,
HeadFName varchar(255) NOT NULL,
HeadMName varchar(255),
HeadLName varchar(255) NOT NULL,
ModifiedDate varchar(255) NOT NULL,
ActionType varchar(255) NOT NULL,
EffectiveDate varchar(255) NOT NULL
);
BULK INSERT HACP_TEMP_PIC_HCV_Imported
FROM 'C:\Work\MTWAdhocReport.csv'
WITH
(
FIRSTROW = 11,
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n',
ERRORFILE = 'C:\Work\Import_ErrorRows_HCV.csv',
TABLOCK
);
UPDATE HACP_TEMP_PIC_HCV_Imported
SET HeadSSN = REPLACE(HeadSSN, '"', ''),
HeadFName = REPLACE(HeadFName, '"', ''),
HeadMName = REPLACE(HeadMName, '"', ''),
HeadLName = REPLACE(HeadLName, '"', ''),
ModifiedDate = REPLACE(ModifiedDate, '"', ''),
ActionType = REPLACE(ActionType, '"', ''),
EffectiveDate = REPLACE(REPLACE(EffectiveDate, '"', ''),',','');
DROP TABLE HACP_PIC_HCV_Imported;
CREATE TABLE HACP_PIC_HCV_Imported
(
HeadSSN varchar(255) NOT NULL,
HeadFName varchar(255) NOT NULL,
HeadMName varchar(255),
HeadLName varchar(255) NOT NULL,
ModifiedDate varchar(255) NOT NULL,
ActionType int NOT NULL,
EffectiveDate varchar(255) NOT NULL
);
INSERT INTO HACP_PIC_HCV_Imported(HeadSSN, HeadFName, HeadMName, HeadLName, ModifiedDate, ActionType, EffectiveDate)
SELECT
LTRIM(HeadSSN),
LTRIM(HeadFName),
LTRIM(HeadMName),
LTRIM(HeadLName),
LTRIM(ModifiedDate),
CONVERT(int, LTRIM(ActionType)),
LTRIM(EffectiveDate)
FROM
HACP_TEMP_PIC_HCV_Imported;
单步执行此操作,创建临时表并将CSV导入其中可以正常工作。更新表以删除EffectiveDate
列中的引号和尾随逗号。创建新表适当的作品。
尝试将数据复制到第二个表格(并将ActionType
转换为INT
)时,我收到以下错误消息:
转换varchar值时转换失败' 4/07 / 2016'数据类型int。
该数据是ModifiedDate
中的第二行值,因此在导入第一行后,这些列显然不同步。在最初导入临时表后,我仔细检查了所有数据是否在正确的列中。
有什么想法?我觉得我错过了一些明显的东西。
答案 0 :(得分:3)
评论太长了。
您的代码表明您正在使用"正确的" CSV格式,允许用双引号括起字段。这些分隔的字段可以包含逗号。这是Excel生成和读取的格式。
我的猜测是你在这样的分隔字段中有一个逗号,这就是放弃导入。
但bulk insert
无法正确读取此格式。具有讽刺意味的是,(至少)一个数据库确实在字段中使用逗号导入CSV格式的文件。
过去,当我遇到这个问题时,它只是在小文件上。我只是将数据加载到Excel中,然后使用制表符或竖条作为分隔符保存。这解决了我的问题。
我现在还不确定是否有更先进的解决方案。但我非常确定您的问题是某些字段在文本字段中嵌入了逗号。