BULK INSERT 错误,原因不明
BULK INSERT error with unknown cause
我正在尝试使用以下方法将一个相当宽(220 列)的数据集批量插入到 SQL Server 2016 table 中:
BULK INSERT dbo.[table]
FROM 'C:\source.txt'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '0x0A'
);
从一开始我就遇到了一些行终止符的问题,但是当我将它修复为 'OX0A' 而不是 '\n' 时一切似乎都运行良好,直到我尝试处理一个相当大的文件(相对于我正在加载的其他文件)。为了给您一个概念,它包含大约 220 列(目标是 NVARCHAR(255),源几乎是 INT)和 10000 行。文件文件大小不超过 40mb。
这是我遇到的错误:
Msg 7399, Level 16, State 1, Line 6
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 6
Cannot fetch a row from OLE DB provider "BULK" for linked server "(null)".
更多信息:
如果我使用 FIRSTROW 和 LASTROW,我会得到同样的错误。
当试图找到有问题的行时,文件在我开始删除行后开始工作(当我的集合中有大约 1910 行时开始工作)。
从哪里删除行并不重要,如果我保留顶部的 1910 行或底部的 1910 行它有效,但是一旦我添加更多行(有效) 又坏了。
我大约 99% 确定我的行结尾或其他格式问题没有问题。
错误文件即使在失败后也是空的。
我的直觉是它与内存管理有关,但据我所知,我的内存已用完并且文件本身相当小,不应该给我带来内存问题。
有什么建议吗?
您能否尝试对该文件执行另存为操作,看看该文件的编码是否不是 ANSI?就我个人而言,除了标准的 '\n' ROWTERMINATOR 之外,我从来没有使用过任何东西。 “0x0A”听起来很奇怪。
编辑:
尝试这些,看看是否有任何一个成功:
SELECT A.* 来自
OPENROWSET(BULK 'C:\source.txt', SINGLE_CLOB ) AS A
使用 bcp 导入并查看是否出现相同的错误
玩 BATCH_SIZE , ROWS_PER_BATCH 。请在尝试之前通过此 link,因为它有影响。 https://technet.microsoft.com/en-us/library/ms188267(v=sql.105).aspx
尝试从 Export/Import 向导导入(右键单击数据库 --> 任务 --> 导入并浏览屏幕)。看看这是否有效。
尝试使用 OPENROWSET 插入
插入 dbo.Table SELECT A.* FROM OPENROWSET(BULK 'C:\source.txt', FORMATFILE='C:\source.Xml'
) 作为 A
现在您需要使用此处的说明生成格式文件 Source.xml --> https://msdn.microsoft.com/en-us/library/ms191516.aspx
bcp 是 SQL 服务器附带的命令行工具。与从 SSMS 查询 window 运行的 BULK Insert 不同,这是一个外部工具。在上面的 link 上有很多关于如何使用它来生成格式文件(或其他方式)的帮助。祝你好运,我稍后再回来查看。
在 Notepad++ 中查看文件。那应该告诉你发生了什么。我敢肯定这不是你想的那样!!
我正在尝试使用以下方法将一个相当宽(220 列)的数据集批量插入到 SQL Server 2016 table 中:
BULK INSERT dbo.[table]
FROM 'C:\source.txt'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '0x0A'
);
从一开始我就遇到了一些行终止符的问题,但是当我将它修复为 'OX0A' 而不是 '\n' 时一切似乎都运行良好,直到我尝试处理一个相当大的文件(相对于我正在加载的其他文件)。为了给您一个概念,它包含大约 220 列(目标是 NVARCHAR(255),源几乎是 INT)和 10000 行。文件文件大小不超过 40mb。
这是我遇到的错误:
Msg 7399, Level 16, State 1, Line 6
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 6
Cannot fetch a row from OLE DB provider "BULK" for linked server "(null)".
更多信息:
如果我使用 FIRSTROW 和 LASTROW,我会得到同样的错误。
当试图找到有问题的行时,文件在我开始删除行后开始工作(当我的集合中有大约 1910 行时开始工作)。
从哪里删除行并不重要,如果我保留顶部的 1910 行或底部的 1910 行它有效,但是一旦我添加更多行(有效) 又坏了。
我大约 99% 确定我的行结尾或其他格式问题没有问题。
错误文件即使在失败后也是空的。
我的直觉是它与内存管理有关,但据我所知,我的内存已用完并且文件本身相当小,不应该给我带来内存问题。
有什么建议吗?
您能否尝试对该文件执行另存为操作,看看该文件的编码是否不是 ANSI?就我个人而言,除了标准的 '\n' ROWTERMINATOR 之外,我从来没有使用过任何东西。 “0x0A”听起来很奇怪。
编辑:
尝试这些,看看是否有任何一个成功:
SELECT A.* 来自 OPENROWSET(BULK 'C:\source.txt', SINGLE_CLOB ) AS A
使用 bcp 导入并查看是否出现相同的错误
玩 BATCH_SIZE , ROWS_PER_BATCH 。请在尝试之前通过此 link,因为它有影响。 https://technet.microsoft.com/en-us/library/ms188267(v=sql.105).aspx
尝试从 Export/Import 向导导入(右键单击数据库 --> 任务 --> 导入并浏览屏幕)。看看这是否有效。
尝试使用 OPENROWSET 插入
插入 dbo.Table SELECT A.* FROM OPENROWSET(BULK 'C:\source.txt', FORMATFILE='C:\source.Xml'
) 作为 A
现在您需要使用此处的说明生成格式文件 Source.xml --> https://msdn.microsoft.com/en-us/library/ms191516.aspx
bcp 是 SQL 服务器附带的命令行工具。与从 SSMS 查询 window 运行的 BULK Insert 不同,这是一个外部工具。在上面的 link 上有很多关于如何使用它来生成格式文件(或其他方式)的帮助。祝你好运,我稍后再回来查看。
在 Notepad++ 中查看文件。那应该告诉你发生了什么。我敢肯定这不是你想的那样!!