【问题标题】:Bulk Insert is throwing an error批量插入引发错误
【发布时间】:2016-08-13 04:21:41
【问题描述】:

我有一个扩展名为“.dat”的源文件,并希望将其作为表加载到 SSMS 中。我的代码如下:

但是给了我以下错误。我还在 Notepad++ 中打开了该文件以检查 ROWTERMINATOR,它似乎是 LF。

消息 4866,第 16 级,状态 8,第 34 行 批量加载失败。数据文件中第 1 行第 25 列的列太长。请验证是否正确指定了字段终止符和行终止符。 消息 7301,第 16 层,状态 2,第 34 行 无法从链接服务器“(null)”的 OLE DB 提供程序“BULK”获取所需的接口(“IID_IColumnsInfo”)。

代码:

USE myDB
GO
CREATE TABLE [dbo].[myTable]

(
Column1 NVARCHAR(255) NULL,
Column2 NVARCHAR(255) NULL,
Column3 NVARCHAR(100) NULL,
Column4 NVARCHAR(255) NULL,
Column5 NVARCHAR(255) NULL,
Column6 NVARCHAR(255) NULL,
Column7  NVARCHAR(255) NULL,
Column8  NVARCHAR(255) NULL,
Column9  NVARCHAR(255) NULL,
Column10  NVARCHAR(255) NULL,
Column11  NVARCHAR(255) NULL,
Column12 NVARCHAR(255) NULL,
Column13  NVARCHAR(255) NULL,
Column14 NVARCHAR(255) NULL,
Column15  NVARCHAR(255) NULL,
Column16 NVARCHAR(255) NULL,
Column17  NVARCHAR(255) NULL,
Column18  NVARCHAR(255) NULL,
Column19  NVARCHAR(255) NULL,
Column20  NVARCHAR(255) NULL,
Column21  NVARCHAR(255) NULL,
Column22 NVARCHAR(255) NULL,
Column23 NVARCHAR(255) NULL,
Column24 NVARCHAR(255) NULL,
Column25 NVARCHAR(255) NULL
);

BULK 
INSERT [dbo].[myTable]
FROM 'C:\Users\John\Documents\work\MyFile.dat'
WITH
(
FIRSTROW = 2,
FIELDTERMINATOR = '\t',
ROWTERMINATOR = '\n'
);
SELECT * FROM [dbo].[myTable]

以下是数据样本以及 SSMS 失败的那一行:

Kansas City 1 494124 20 McDonalds KANSAS CUSTOMERS 22 WYANDOTTE COUNTY 239 Wyandotte County 964 S 73RD ST KANSAS CITY KS 66111 2805 Y Y Y N N 4 D Old School Loyal N 49412401

【问题讨论】:

  • 似乎是???您不能确认行尾字符吗?可能是cr-lf。 (\r\n)
  • 是的,行终止符是 LF,即 '\n' ,但我也尝试过 '\r\n'
  • 数据中的示例行?您的数据中有多少列?是大于还是小于 9?
  • 共有 25 列。但出于安全原因,我不能透露它。但是当我注释掉 FIRSTROW 和 ROWTERMINATOR 时,它确实插入了许多行,但都在源文件的一个(第 25 列)中
  • 没有样本数据也无济于事。不过,您应该查看数据。它说它在第 9 列上失败了。您的表中有 9 列,但您正在尝试导入 25 个字段???这是个问题。

标签: sql sql-server load bulkinsert


【解决方案1】:

这是我工作的常见问题。如果您有换行符结尾,并且在逻辑上使用ROWTERMINATOR = '\n',bcp 会在其中添加\r

当您以交互方式使用 bcp 并指定 \n(换行符)作为行时 终止符,bcp 自动为其添加前缀 \r (回车) 字符,导致行终止符 \r\n。 (Source)

我不确定它对你的情况有帮助,但如果我使用 ROWTERMINATOR = "0x0a" 它工作得很好。

编辑

在您的评论中,您说您正在尝试将 25 列插入 9 列表中。显然那是行不通的。您应该首先修复列数。

【讨论】:

  • 不,我的表定义中有 25 列。他只是一个表象。上面代码中的 9 列代表我无法透露的实际代码中失败的第 25 列。
  • 另外我没有使用 bcp 实用程序
  • 我已经修改了失败的实际代码。请查看更新后的代码。
  • 我还添加了一个数据样本
  • @enigma6205,我看不出有什么明显的问题。您自己创建文件吗?如果是这样,您可以尝试更改字段终止符。
【解决方案2】:

ROWTERMINATOR = "0x0a"

为了胜利!

【讨论】:

    【解决方案3】:

    确定您的用户数据库身份验证可以访问批量插入吗? 如果用户使用 SQL Server 登录,则使用 SQL Server 进程帐户的安全配置文件。无法在数据库引擎之外对使用 SQL Server 身份验证的登录进行身份验证。因此,当使用 SQL Server 身份验证的登录名启动 BULK INSERT 命令时,将使用 SQL Server 进程帐户(SQL Server 数据库引擎服务使用的帐户)的安全上下文建立与数据的连接。 要成功读取源数据,您必须授予 SQL Server 数据库引擎使用的帐户访问源数据的权限。相反,如果 SQL Server 用户使用 Windows 身份验证登录,则该用户只能读取该用户帐户可以访问的那些文件,而不管 SQL Server 进程的安全配置文件。

    例如,考虑使用 Windows 身份验证登录到 SQL Server 实例的用户。为了使用户能够使用 BULK INSERT 或 OPENROWSET 将数据从数据文件导入 SQL Server 表,用户帐户需要对数据文件具有读取权限。通过访问数据文件,即使 SQL Server 进程没有访问文件的权限,用户也可以将数据从文件导入到表中。用户不必向 SQL Server 进程授予文件访问权限。

    如果您有权批量插入数据库 检查 dat 文件中的数据类型和 datalen

    【讨论】:

    • 我正在使用 Windows 身份验证并且我有管理员。我可以访问该文件以在我的服务器上进行批量插入。我检查了源文件中的数据长度,它与列数据类型匹配
    • "重要提示!ntext、text 和 image 数据类型将在 SQL Server 的未来版本中删除。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。请改用 nvarchar(max)、varchar(max) 和 varbinary(max)。" (msdn.microsoft.com/en-us/library/ms187993.aspx)。您应该nvarchar更改为ntext
    • HoneyBadger,我完全同意你的看法。谢谢你的提示。
    猜你喜欢
    • 2020-05-09
    • 2023-03-03
    • 2017-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    相关资源
    最近更新 更多