SQL批量插入 - 不匹配

时间:2011-05-18 18:51:10

标签: sql tsql

好的,所以我收到以下错误,这看起来很奇怪。

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

我的CSV文件格式为以下格式

1,阿龙,Aaberg,19700926,MALE

但如果我这样做:

INSERT INTO Test.BulkInsert (FirstName, LastName, Birthday, Gender)
VALUES ('1' 'Test', 'Me', 19851118, 'Male')

工作正常吗?是什么赋予了?我在阳光下尝试了一切。如果我使用INT作为生日导入的数据类型工作正常。我试过然后CAST和/或转换int,我明显得到算术溢出。

我忘了给你表代码:

CREATE TABLE Test.BulkInsert (ID int NOT NULL,
                  FirstName VARCHAR(40),
                  LastName VARCHAR(40),
                  BirthDay SMALLDATETIME,
                          Gender VARCHAR(6)

)
GO

5 个答案:

答案 0 :(得分:0)

您是否检查过区域设置?我相信BCP会在尝试导入日期时间列时使用它。

或者(和大多数人一样),您可以作为VARCHAR导入到临时表中,然后使用日期时间列上的CONVERT语句在您的真实表中执行INSERT

答案 1 :(得分:0)

一个可能性(或者你的帖子中可能是拼写错误):你的桌子有四列;您的CSV行有五个值。

另一个是你的SQL语句有一个整数值。 CSV插入可能将其视为字符串;实际上,这个SQL:

INSERT INTO Test.BulkInsert (FirstName, LastName, Birthday, Gender)
VALUES ('1' 'Test', 'Me', '19851118', 'Male')

答案 2 :(得分:0)

CSv文件几乎与包含错误数据的XLS和XLST文件一样糟糕。我建议打开它并查看引用行中的数据和它们附近的行。

答案 3 :(得分:0)

我会查看您的数据,看看您在第129行传递的日期。我相信你看到的问题是因为日期超出SMALLDATETIME值的范围(范围是1900年1月1日到2079年6月6日)。也许这一年有几个数字转换(例如,9185而不是1985年)或类似的东西。这就有意义了,当你首先将日期转换为varchar时,为什么你收到消息“将varchar数据类型转换为smalldatetime数据类型会导致超出范围的值”。

答案 4 :(得分:0)

听起来你的出生日期与smalldatetime要求(?)

不符

首先将它作为int导入(因为你知道它有效)。

然后你可能会查询一些事情 1)长度<1的长度。 8
2)birthdate&lt; 19000101个
3)生日&gt; 20790601个
(1900年1月1日,到2079年6月6日是范围限制)
4)确保每个字符都是数字0-9

然后......

希望你不必每次都经历这一切。但是,如果你这样做,可以考虑在.csv创建过程中加入某种有效性。