首页 > 解决方案 > SQL Server 2012 及更高版本的批量插入问题

问题描述

我们与第 3 方合作,他们为我们提供的文件基本上是他们数据库中的转储文件。我们公司支持 SQL Server 2012 以及 SQL Server 2014 及更高版本。我需要批量插入这些文件并让一组文件适用于任何客户。

他们为我们提供了来自 UNIX 系统的文件,采用 utf-8 编码。我知道 SQL Server 2012 不支持 utf-8。从这里开始,我已经将这些文件转换为 utf-16(使用 Textpad8)。总共有大约 22 个文件。

我使用以下语法:

BULK INSERT database.dbo.tablename 
FROM '\\server\filename.txt' 
WITH (FIRSTROW =2, ROWTERMINATOR ='0x0a')

这当然适用于 SQL Server 2014 框中的所有文件。

22 个文件中的一个文件不适用于 SQL Server 2012,我无法弄清楚出了什么问题。该特定文件进入以这种方式定义的表中:

CREATE TABLE [dbo].[Map]
(
    termid int NOT NULL,
    mapguid char(22) NOT NULL,
    mapsequence int NOT NULL,
    conceptguid char(22) NOT NULL,
    mapdefnguid char(22) NOT NULL,
    mapquality int NULL, 

    CONSTRAINT [PK_Map] 
        PRIMARY KEY CLUSTERED ([termid] ASC, [mapguid] ASC, [mapsequence] ASC)
) ON [PRIMARY];

这是示例数据的样子

termid  mapguid mapsequence conceptguid mapdefnguid mapquality
260724  Nm9T2QFFs67xk2/zCgEDHw  0   AExH2wEce5u4wbhnqf4ZgQ  TDMQWQE6UQdXAoATCgECyQ  
172288  AW8L6AEj+br0hsZ3CgEBig  0   BgCTWgDjf6OlTk1oCwsLDQ  AUKoDQEjn6KrxIAJCgEBmw  
377707  PtArUQE7q1ajeoiRCgEDAQ  0   ACSYtQDsdrQtN1h2qf79/w  TDMQWQE6UsYdrYAbCgECeg  

tab 是列分隔符,LF 是行终止符

这是我得到的错误:

消息 4864,级别 16,状态 1,第 1
行第 2 行第 1 列(termid)的批量加载数据转换错误(指定代码页的类型不匹配或无效字符)。

消息 4864,级别 16,状态 1,第 1
行第 3 行第 1 列(termid)的批量加载数据转换错误(指定代码页的类型不匹配或无效字符)。

我已经在谷歌(和此处)上搜索了该错误,并且已经看到如果某些内容实际上被指定为字面上的“NULL”而不是空白,那么您可能会在哪里得到该错误。

我什至已经创建了自己的文件,但我仍然遇到同样的错误。在我自己的文件中,我实际上填充了最后一行,认为这可能会导致问题,但错误似乎表明它不喜欢第一列的内容。

任何人都可以帮我一些建议吗?

标签: sql-serverbulkinsert

解决方案


我不知道这是否真的是一个答案,但不知何故,文件可以使用 utf-8 编码很好地导入,这对我来说没有多大意义,因为 SQL 2012 不应该支持它。我查看了表中的数据,似乎还不错,所以我在那里并没有真正的解释。

然后我将文件转换为 utf-16 并重新运行该过程并再次开始出现上述错误,所以......耸了耸肩


推荐阅读