RFC 4180:
RFC 4180定义了2556945200920921021088。Microsoft Connect的要求之一如下所述。 这是RFC链接中的点Microsoft Connect。
If double-quotes are used to enclose fields, then a double-quote
appearing inside a field must be escaped by preceding it with
another double quote. For example:
"aaa","b""bb","ccc"
SQL Server 2000:
尽管RFC 4180本身似乎仅在2005年10月发布,但Microsoft Connect中的Microsoft Connect似乎符合上述标准。我使用的是下面所述的SQL Server 2000版本。
Microsoft SQL Server 2000 - 8.00.2039 (Intel X86)
May 3 2005 23:18:38
Copyright (c) 1988-2003 Microsoft Corporation
Standard Edition on Windows NT 5.0 (Build 2195: Service Pack 4)
SQL Server 2012:
Microsoft Connect中的Microsoft Connect不会根据RFC 4180中定义的标准将表中的数据导出到CSV文件。我使用的是下面所述的SQL Server 2012版本。
Microsoft SQL Server 2012 - 11.0.2316.0 (X64)
Apr 6 2012 03:20:55
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.1 (Build 7601: Service Pack 1) (Hypervisor)
问题模拟:
这是我在SQL Server 2000和SQL Server 2012中都运行的示例。我运行以下查询来创建表并插入几条记录。 Microsoft Connect列中的数据带有双引号。 我的意图是使用它们的内置导出数据向导从这两个SQL Server版本中导出数据,并比较生成的CSV文件。
CREATE TABLE dbo.ItemInformation(
ItemId nvarchar(20) NOT NULL,
ItemDesc nvarchar(100) NOT NULL
)
GO
INSERT INTO dbo.ItemInformation (ItemId, ItemDesc) VALUES ('100338754', 'Crown Bolt 3/8"-16 x 1" Stainless-Steel Hex Bolt');
INSERT INTO dbo.ItemInformation (ItemId, ItemDesc) VALUES ('202255836', 'Simpson Strong-Tie 5/8" SSTB Anchot Bolt');
INSERT INTO dbo.ItemInformation (ItemId, ItemDesc) VALUES ('100171631', 'Grip-Rite #11 x 1-1/2" Electro-Galvanized Steel Roofing Nails');
INSERT INTO dbo.ItemInformation (ItemId, ItemDesc) VALUES ('202210289', 'Crown Bolt 1/2" x 3" "Zinc-Plated" Universal Clevis Pin');
INSERT INTO dbo.ItemInformation (ItemId, ItemDesc) VALUES ('100136988', 'Tapcon 3/16" x 1-3/4" Climaseal Steel "Flat-Head" Phillips Concrete Anchors (75-Pack)');
INSERT INTO dbo.ItemInformation (ItemId, ItemDesc) VALUES ('203722101', 'KwikTap 3/16" x 2-1/4" "Flat-Head" Concrete Screws (100-Pack)');
GO
在Microsoft Connect中的Microsoft Connect上,我使用以下设置将数据导出到CSV文件。 我将文件保存为Microsoft Connect。
在Microsoft Connect中的Microsoft Connect上,我使用以下设置将数据导出到CSV文件。 我将文件保存为Microsoft Connect。
这是使用超越比较在两个文件之间进行的比较。 左侧包含25569452009209210210生成的文件,右侧包含SQL Server 2012生成的文件。您会注意到SQL Server 2000的左侧文件包含其他双引号来补偿数据列中的嵌入式引号。 这符合RFC 4180中指定的标准,但2556945200920921021092生成的文件中显然缺少该标准
在网络上搜索:
我在网上搜索了此错误,并找到了以下链接。 以下是Microsoft Connect上的错误报告。 所有这些问题似乎与导入文件有关,但与导出数据无关。 所有这些错误都已作为Microsoft Connect关闭。
SSIS平面文件解析器不读取文本数据中嵌入的列定界符
平面文件连接管理器不处理CSV文件中的文本定界符
平面文件导入中的嵌入式引号失败
BUG:平面文件连接管理器:多字符文本限定符不能加载所有数据
MSDN博客上的以下帖子指出,在SQL Server 2012中已对Microsoft Connect进行了更改
SSIS-SQL Server Denali的新增功能
MSDN博客上的另一篇文章在Microsoft Connect部分下也声明了同样的内容。
Denali中的平面文件源更改
我知道的解决方法:
我知道一种解决方法,可以通过编写查询来解决此问题,该查询将用两个双引号(2556945200920921021088)替换我列数据中的所有双引号(Microsoft Connect),以便导出的文件最终将带有正确的嵌入式限定符数据。 这样可以避免直接从表中直接提取数据。
我的问题:
我不知道此问题是否已在Microsoft Connect中得到真正解决。是否仅针对将文本限定符嵌入到Microsoft Connect的文件和将Microsoft Connect数据嵌入CSV的Microsoft Connect修复了此问题?
可能是,我显然做错了什么,却错过了显而易见的事情。 有人可以告诉我我在做什么错吗?
Microsoft Connect:
我已经在Microsoft Connect网站上提交了错误报告,以获取他们的反馈。 这是错误报告的链接。 如果您同意这是一个错误,请访问下面的链接在2556945200920921021088网站上投票。
导出为CSV期间的嵌入式文本限定符不符合RFC 4180