###RFC 4180:
RFC 4180定义Common Format and MIME Type for Comma-Separated Values (CSV) Files
. 的要求之一RFC 4180
如下所述。这是#7
RFC 链接中的要点。
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:
DTS Export/Import Wizard
inSQL Server 2000
似乎符合上述标准,尽管 RFC 4180 本身似乎仅在2005 年10 月发布。我正在使用下面所述的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:
SQL Server Import and Export Wizard
inSQL Server 2012
不会根据 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 <X64> (Build 7601: Service Pack 1) (Hypervisor)
###问题模拟:
这是我在SQL Server 2000和SQL Server 2012中运行的示例。我运行以下查询来创建一个表并插入几条记录。该ItemDesc
列包含带有双引号的数据。我的目的是使用它们内置的导出数据向导从这两个 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
在DTS Export/Import Wizard
中SQL Server 2000
,我使用以下设置将数据导出到 CSV 文件。我将文件保存在 name 下SQLServer2000_ItemInformation.csv
。
在SQL Server Import and Export Wizard
中SQL Server 2012
,我使用以下设置将数据导出到 CSV 文件。我将文件保存在 name 下SQLServer2012_ItemInformation.csv
。
这是使用 Beyond Compare 对两个文件进行的比较。左边是生成的文件SQL Server 2000
,右边是生成的文件SQL Server 2012
。您会注意到左侧文件中SQL Server 2000
包含额外的双引号,以补偿数据列中嵌入的引号。这符合中指定的标准,RFC 4180
但它显然从生成的文件中丢失SQL Server 2012
###网络搜索:
我在网上搜索了这个错误并找到了以下链接。以下是 Microsoft Connect 上的错误报告。所有这些问题似乎都与导入文件有关,但与导出数据无关。所有这些错误都已作为Fixed
.
- SSIS 平面文件解析器不读取嵌入在文本数据中的列分隔符
- 平面文件连接管理器不处理 CSV 文件中的文本分隔符
- 平面文件导入中的嵌入引号失败
- BUG:平面文件连接管理器:多字符文本限定符不加载所有数据
以下 MSDN 博客上的帖子指出,SQL Server 2012 中已对以下方面进行了更改Flat file source supports embedded qualifiers and a variable number of columns per row
MSDN 博客上的另一篇文章在该部分下也有相同的说明Embedded Qualifiers
。
###我知道的解决方法:
我知道通过编写一个查询来解决此问题,该查询将"
用两个双引号 ( ) 替换列数据中的所有双引号 ( ""
),以便导出的文件最终得到正确的嵌入限定符数据。这将避免直接从表中提取数据。
###我的问题:
我不知道这个问题是否真的在
SQL Server 2012
.importing
是否仅针对具有嵌入文本限定符的文件和not
CSVexporting
数据修复了此问题?可能,我显然做错了什么并且错过了显而易见的事情。有人可以向我解释我在这里做错了什么吗?
###微软连接:
我已在 Microsoft Connect 网站上提交了一份错误报告以获取他们的反馈。这是错误报告的链接。如果您同意这是一个错误,请访问以下链接在Microsoft Connect
网站上投票。