SQL不会使用BULK INSERT插入空值

时间:2014-07-24 19:38:22

标签: sql-server csv bulkinsert

我有一个CSV文件,每行看起来与此类似:

EASTTEXAS,NULL,BELLVILLE AREA,NULL,BELLVILLE AREA,RGP,NULL,NULL,0,NULL,NULL,NULL,1,1,PM,PM Settings,NULL,NULL

我无法找到任何关于在执行BULK INSERT时如何处理NULL值的示例,所以我认为没问题。

当我尝试运行BULK INSERT时,它给了我这个错误:

  

Msg 4864,Level 16,State 1,Line 28   第1行第12列(ClassificationPK)的批量加载数据转换错误(指定代码页的类型不匹配或无效字符)。

这是我的表,不是:

CREATE TABLE #Assets
(
ParentID VARCHAR(255) NULL,
ClassificationID VARCHAR(255) NULL,
AssetID VARCHAR(255) NULL,
AssetType VARCHAR(255) NULL,
AssetName VARCHAR(255) NULL,
RepairCenterID VARCHAR(255) NULL,
LaborID VARCHAR(255) NULL,
Owner VARCHAR(255) NULL,
IsLocation VARCHAR(255) NULL,
AssetTypeDesc VARCHAR(255) NULL,
ClassificationName VARCHAR(255) NULL,
ClassificationPK INT NULL,
IsUp BIT NULL,
RequesterCanView BIT NULL,
PMCycleStartBy VARCHAR(255) NULL,
PMCycleStartByDesc VARCHAR(255) NULL,
PMCycleStartDate DATETIME NULL,
PMCounter INT NULL,
ParentPK INT NULL,
ParentName VARCHAR(255) NULL,
AssetPK INT NULL,
RepairCenterPK INT NULL,
RepairCenterName VARCHAR(255) NULL,
LaborPK INT NULL)

BULK
INSERT #Assets
FROM '\\cdmsqlint01\drop\assets.csv'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n',
KEEPNULLS
)
GO

SELECT * FROM #Assets

DROP TABLE #Assets

关于我在这里做错了什么的想法?

2 个答案:

答案 0 :(得分:14)

根据:

http://msdn.microsoft.com/en-us/library/ms187887.aspx

可以通过在文件中包含空字段来插入空值。

示例文件是:

1,,DataField3
2,,DataField3

导入文件保留空值的示例方法是:

USE AdventureWorks;
GO
BULK INSERT MyTestDefaultCol2
FROM 'C:\MyTestEmptyField2-c.Dat'
WITH (
    DATAFILETYPE = 'char',
    FIELDTERMINATOR = ',',
    KEEPNULLS
);
GO

当然,这意味着您必须将" NULL"更改为"",并且您想要作为空字符串的任何空字符串将被解释为空值,但它可能足以让你入手?我想要保留你需要从

更改的空字符串列
field1,,field2

field1,"",field2

例如

答案 1 :(得分:1)

迟到的PS。

请注意,如果最后一列 DATETIME 类型并且值为 null ,则似乎存在错误 strong>,那么你必须在空字段之后,在行分隔符之前有一个(通常是多余但被接受的)字段分隔符,否则你会收到错误。

ADD:这不能始终如一地工作(有时会这样做!?!?),以使其稳定地更改你的ROWterminator以开始使用FIELDterminator

e.g。 FIELDTERMINATOR ='#',ROWTERMINATOR ='#\ n'

下面是一个错误的例子,当你把事情搞乱时,你会得到错误:

  

批量加载数据转换错误(类型不匹配或无效字符   对于第1行,第31列(MyDateTimeField)。

的指定代码页

(是的,我尝试使用少于7F字符的所有ASCII示例并获得相同的结果)

示例:

第一批散货失败了很多。另一个在第五个失败,尽管与第二个相似,但在这个特殊情况下最后不允许任何事情......

测试数据:

CREATE TABLE TEST_Bulk(
    id int,
    ts1 datetime,
    txt varchar(40) NULL,
    ts2 datetime,
    ts3 datetime,
) 
GO

BULK INSERT TEST_Bulk FROM 'D:\File.txt' WITH (FIRSTROW=1, FIELDTERMINATOR = '#', ROWTERMINATOR = '\n', CODEPAGE= 'ACP' ,TABLOCK)

BULK INSERT TEST_Bulk FROM 'D:\File.txt' WITH (FIRSTROW=1, FIELDTERMINATOR = '#', ROWTERMINATOR = '#\n', CODEPAGE= 'ACP' ,TABLOCK)

select * from TEST_Bulk

drop table TEST_Bulk

和sql

public override func draw(_ rect: CGRect) {
    let context = UIGraphicsGetCurrentContext()
    context!.setLineWidth(2.0)
    context!.setStrokeColor(UIColor.red.cgColor)
    context?.move(to: CGPoint(x: 0, y: self.frame.size.height))
    context?.addLine(to: CGPoint(x: self.frame.size.width, y: 0))
    context!.strokePath()
}