好的,所以我收到以下错误,这看起来很奇怪。
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
答案 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创建过程中加入某种有效性。