繁体   English   中英

SQL大容量插入-不匹配

[英]SQL Bulk Insert — Mismatch

好的,所以我收到以下错误,这似乎很奇怪。

消息4864,级别16,状态1,第3行129行第4列(生日)的批量加载数据转换错误(类型不匹配或指定代码页的字符无效)。

我的CSV文件的格式如下

1,亚伦,亚伯格,19700926,男

但是,如果我执行以下操作:

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

您检查过您的区域设置了吗? 我相信BCP会在尝试导入datetime列时使用它。

另外(大多数人似乎可以这样做),您可以将其作为VARCHAR导入到临时表中,然后在datetime列上使用CONVERT语句对实际表进行INSERT

一种可能性(或者您的帖子中可能有错字):您的表格有四列; 您的CSV行有五个值。

另一个是您的SQL语句具有整数值。 CSV插入内容可能会将其视为字符串; 实际上,此SQL:

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

CSv文件与包含不良数据的XLS和XLST文件几乎一样严重。 我建议打开它,然后查看所引用的行及其附近的行中的数据。

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

听起来您的生日不符合smalldatetime要求(?)

首先将其作为int导入(因为您知道这是可行的)。

然后您可能需要查询一些内容
1)长度<8
2)生日<19000101
3)生日> 20790601
(1900年1月1日至2079年6月6日是范围限制)
4)确保每个字符都是数字0-9

接着...

希望您不必每次都经历。 但是,如果这样做,请考虑对.csv创建过程进行某种形式的验证。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM