Sql server SQL Server 2012及更高版本的大容量插入问题

Sql server SQL Server 2012及更高版本的大容量插入问题,sql-server,bulkinsert,Sql Server,Bulkinsert,我们与第三方合作,他们向我们提供的文件基本上是他们数据库中的转储文件。我们公司支持SQL Server 2012以及SQL Server 2014及更高版本。我需要批量插入这些文件,并有一套文件的任何客户端的工作 他们从UNIX系统向我们提供utf-8编码的文件。我知道SQL Server 2012不支持utf-8。从这里开始阅读,我开始将这些文件转换为utf-16(使用Textpad8)。总共大约有22个文件 我使用以下语法: BULK INSERT database.dbo.tablenam

我们与第三方合作,他们向我们提供的文件基本上是他们数据库中的转储文件。我们公司支持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个文件中有一个不适用于SQLServer2012,我无法找出问题所在。该特定文件进入以下定义的表:

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是行终止符字符

这是我得到的错误:

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

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

我已经在谷歌上搜索过这个错误(这里也是),并且看到了如果某个东西实际上被指定为“NULL”而不是空白,那么你可能会在哪里得到这个错误

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


有人能帮我提些建议吗?

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


然后,我将文件转换为utf-16并重新运行该过程,并再次开始获取上述错误,因此…shrug

您可以发布示例文件内容和BCP命令吗?我无法发布该文件,其大小超过500 MB,但我确实发布了上面的数据示例。类似地,我在上面发布了大容量插入语法,没有使用BCP。文件中的某些内容在粘贴到问题正文中后无法保存。您是指看到实际的列和行终止符吗?我的一个想法是mapquality列在文件中为空,我通过研究发现,有时会导致出现错误……在大多数情况下,UTF-8与ASCII或本机代码页编码无法区分(因为它们将ASCII作为子集),除了可能在开头包含字节顺序标记。此BOM表在Windows上是标准的,但在Unixen上通常被省略(因此除了通过上下文之外,无法知道所使用的编码是否为UTF-8)。如果文件中没有不能用ASCII编码的字符,则没有BOM表的UTF-8文件是普通ASCII文件,将导入。(如果有不能用ASCII编码的字符,您将得到。)我可以在内部告诉您,我们有一个盒子,其中SQL 2012运行service pack 3,另一个运行service pack 4,service pack 4盒子不会导入任何utf-16文件,它在每个文件的初始帖子中都会像上面一样抱怨…初始帖子来自ServicePack3上的框,在那里它似乎只抱怨1个文件。