Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server T-SQL大容量插入类型不匹配_Sql Server_Tsql_Bulkinsert_Type Mismatch - Fatal编程技术网

Sql server T-SQL大容量插入类型不匹配

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

我正在尝试从一个大型CSV文件到一个表进行简单的批量插入。表和文件具有匹配的列。这是我的代码:

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
    仅适用于日期(无时间段);注意:无破折号,这非常重要
    YYYY-MM-DD
    独立于SQL Server中的日期格式设置,在所有情况下都将工作
或:

  • 日期和时间的
    YYYY-MM-DDTHH:MM:SS
    -此处注意:此格式有破折号(但可以省略),并且在
    DATETIME
    的日期和时间部分之间有一个固定的
    T
    分隔符
这对SQL Server 2000及更新版本有效

如果您使用SQL Server 2008或更高版本以及
日期
数据类型(仅
日期
-
日期时间
!),那么您确实也可以使用
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
    而不是
    2020-08-22 13:51:57
    用于在CSV导入文件中指定日期和时间


有许多字符串文本格式需要转换为SQL Server支持的日期和时间-请参阅。大多数格式取决于您的设置,因此,这些设置有时可能有效,有时无效。尤其是
DATETIME
数据类型,它对字符串文本的哪些格式有效以及其他(大多数)不适用的格式非常挑剔<代码>日期时间2(n)更宽容,处理起来也不那么挑剔

解决此问题的方法是使用SQL Server支持的(稍作调整的)ISO-8601日期格式
,无论您的SQL Server语言和日期格式设置如何,此格式始终有效

SQL Server支持的有两种风格:

  • YYYYMMDD
    仅适用于日期(无时间段);注意:无破折号,这非常重要
    YYYY-MM-DD
    独立于SQL Server中的日期格式设置,在所有情况下都将工作
或:

  • 日期和时间的
    YYYY-MM-DDTHH:MM:SS
    -此处注意:此格式有破折号(但可以省略),并且在
    DATETIME
    的日期和时间部分之间有一个固定的
    T
    分隔符
这对SQL Server 2000及更新版本有效

如果您使用SQL Server 2008或更高版本以及
日期
数据类型(仅
日期
-
日期时间
!),那么您确实也可以使用
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
    而不是
    2020-08-22 13:51:57
    用于在CSV导入文件中指定日期和时间

    2020-08-22T13:51:57
    2020-08-22T14:13:13
    2020-08-22T14:16:23