批量插入引发错误

时间:2016-08-13 04:21:41

标签: sql sql-server load bulkinsert

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

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

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

代码:

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

3 个答案:

答案 0 :(得分:1)

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

  

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

我不确定它对你的情况有帮助,但是如果我使用ROWTERMINATOR = "0x0a"它的效果非常好。

修改

在评论中,您说您正在尝试在9列表中插入25列。显然这不起作用。您应该先确定列数。

答案 1 :(得分:0)

首先,您应该将第9列的数据类型从 nvarchar(max)更改为 ntext 然后, 确保您的用户数据库身份验证可以访问批量插入? 如果用户使用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

答案 2 :(得分:0)

ROWTERMINATOR = "0x0a"

获胜!