sql-server - 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”而不是空白,那么您可能会在哪里得到该错误。
我什至已经创建了自己的文件,但我仍然遇到同样的错误。在我自己的文件中,我实际上填充了最后一行,认为这可能会导致问题,但错误似乎表明它不喜欢第一列的内容。
任何人都可以帮我一些建议吗?
解决方案
我不知道这是否真的是一个答案,但不知何故,文件可以使用 utf-8 编码很好地导入,这对我来说没有多大意义,因为 SQL 2012 不应该支持它。我查看了表中的数据,似乎还不错,所以我在那里并没有真正的解释。
然后我将文件转换为 utf-16 并重新运行该过程并再次开始出现上述错误,所以......耸了耸肩
推荐阅读
- jquery - 如何在中间div中有长内容时修复左右div
- spring - 控制器中的重复代码以在其他控制器中使用
- python - “BadZipFile:文件不是 zip 文件” - 突然弹出错误
- google-apps-script - 如何使这个查询更有效或进入谷歌应用脚本?
- db2 - DB2-LUW 中的正则表达式查询
- postgresql - 动态表查询选择
- mysql - 我正在尝试为我的 laravel 网站获取最近的聊天记录。但是查询返回错误的输出
- typescript - 如何将正确的构造应用于 CloudFrontWebDistribution 类
- odoo - 如何输入一堆数据?
- java - jfree图表中极坐标图中可见的刻度线