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