Sql server T-SQL大容量插入类型不匹配
我正在尝试从一个大型CSV文件到一个表进行简单的批量插入。表和文件具有匹配的列。这是我的代码:Sql server T-SQL大容量插入类型不匹配,sql-server,tsql,bulkinsert,type-mismatch,Sql Server,Tsql,Bulkinsert,Type Mismatch,我正在尝试从一个大型CSV文件到一个表进行简单的批量插入。表和文件具有匹配的列。这是我的代码: BULK INSERT myTable FROM 'G:\Tests\mySource.csv' WITH ( FIRSTROW = 2, FIELDTERMINATOR = ',', ROWTERMINATOR = '\n', -- ROWTERMINATOR = '0x0a', BATCHSIZE = 1000, MAXERRORS = 2 ) GO
BULK INSERT myTable
FROM 'G:\Tests\mySource.csv'
WITH (
FIRSTROW = 2,
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n',
-- ROWTERMINATOR = '0x0a',
BATCHSIZE = 1000,
MAXERRORS = 2
)
GO
如您所见,我已经尝试使用行终止符\n
和0x0a
(以及更多)
我不断收到类型不匹配错误:
Msg 4864, Level 16, State 1, Line 1
Bulk load data conversion error (type mismatch or invalid character for the specified codepage) for row 2, column 18 (createdAt).
Msg 4864, Level 16, State 1, Line 1
Bulk load data conversion error (type mismatch or invalid character for the specified codepage) for row 3, column 18 (createdAt).
Msg 4864, Level 16, State 1, Line 1
Bulk load data conversion error (type mismatch or invalid character for the specified codepage) for row 4, column 18 (createdAt).
Msg 4865, Level 16, State 1, Line 1
Cannot bulk load because the maximum number of errors (2) was exceeded.
Msg 7399, Level 16, State 1, Line 1
The OLE DB provider "BULK" for linked server "(null)" reported an error. The provider did not give any information about the error.
Msg 7330, Level 16, State 2, Line 1
Cannot fetch a row from OLE DB provider "BULK" for linked server "(null)".
列createdAt
的类型为datetime
:
CREATE TABLE [dbo].[myTable]
(
...
[createdAt] [datetime] NULL,
...
)
以下是取自前三行的createdAt
列的值:
2020-08-22 13:51:57
2020-08-22 14:13:13
2020-08-22 14:16:23
我还按照建议尝试了不同的数字格式。我还尝试将列类型更改为DATETIME2(n)
:
我不知道还要复习什么
我将感谢任何帮助
谢谢 SQL Server支持多种格式的字符串文本转换为日期和时间-请参阅。大多数格式取决于您的设置,因此,这些设置有时可能有效,有时无效。尤其是
DATETIME
数据类型,它对字符串文本的哪些格式有效以及其他(大多数)不适用的格式非常挑剔<代码>日期时间2(n)更宽容,处理起来也不那么挑剔
解决此问题的方法是使用SQL Server支持的(稍作调整的)ISO-8601日期格式,无论您的SQL Server语言和日期格式设置如何,此格式始终有效
SQL Server支持的有两种风格:
仅适用于日期(无时间段);注意:无破折号,这非常重要YYYYMMDD
独立于SQL Server中的日期格式设置,在所有情况下都将不工作李>YYYY-MM-DD
- 日期和时间的
-此处注意:此格式有破折号(但可以省略),并且在YYYY-MM-DDTHH:MM:SS
的日期和时间部分之间有一个固定的DATETIME
分隔符T
日期
数据类型(仅日期
-非日期时间
!),那么您确实也可以使用YYYY-MM-DD
格式,这也适用于SQL Server中的任何设置
不要问我为什么这个话题如此棘手,有些令人困惑——事实就是这样。但是使用YYYYMMDD
格式,您应该可以使用任何版本的SQL Server以及SQL Server中的任何语言和日期格式设置
对于SQL Server 2008及更新版本,如果只需要日期部分,建议使用DATE
;如果同时需要日期和时间,建议使用DATETIME2(n)
。如果可能的话,您应该尝试逐步淘汰DATETIME
数据类型
在你的情况下,我会尝试以下两种方法之一:
- 如果可以使用
而不是DATETIME2(n)
作为列的数据类型,那么仅此一项就可以解决所有问题DATETIME
- 如果无法使用
-请尝试使用DATETIME2(n)
而不是2020-08-22T13:51:57
用于在CSV导入文件中指定日期和时间2020-08-22 13:51:57
DATETIME
数据类型,它对字符串文本的哪些格式有效以及其他(大多数)不适用的格式非常挑剔<代码>日期时间2(n)更宽容,处理起来也不那么挑剔
解决此问题的方法是使用SQL Server支持的(稍作调整的)ISO-8601日期格式,无论您的SQL Server语言和日期格式设置如何,此格式始终有效
SQL Server支持的有两种风格:
仅适用于日期(无时间段);注意:无破折号,这非常重要YYYYMMDD
独立于SQL Server中的日期格式设置,在所有情况下都将不工作李>YYYY-MM-DD
- 日期和时间的
-此处注意:此格式有破折号(但可以省略),并且在YYYY-MM-DDTHH:MM:SS
的日期和时间部分之间有一个固定的DATETIME
分隔符T
日期
数据类型(仅日期
-非日期时间
!),那么您确实也可以使用YYYY-MM-DD
格式,这也适用于SQL Server中的任何设置
不要问我为什么这个话题如此棘手,有些令人困惑——事实就是这样。但是使用YYYYMMDD
格式,您应该可以使用任何版本的SQL Server以及SQL Server中的任何语言和日期格式设置
对于SQL Server 2008及更新版本,如果只需要日期部分,建议使用DATE
;如果同时需要日期和时间,建议使用DATETIME2(n)
。如果可能的话,您应该尝试逐步淘汰DATETIME
数据类型
在你的情况下,我会尝试以下两种方法之一:
- 如果可以使用
而不是DATETIME2(n)
作为列的数据类型,那么仅此一项就可以解决所有问题DATETIME
- 如果无法使用
-请尝试使用DATETIME2(n)
而不是2020-08-22T13:51:57
用于在CSV导入文件中指定日期和时间2020-08-22 13:51:57
2020-08-22T13:51:57 2020-08-22T14:13:13 2020-08-22T14:16:23