SSIS - 文本限定符的用途

3

添加文本限定符到SSIS平面文本文件输出的目的是什么?

我正在从一个SQL数据库中提取数据,其中数据中包含引号/逗号/管道符等常见分隔符。

以下是一列数据的极端示例:

"Johnson"|Smith,Jones

我将导出设置为逗号分隔,并使用双引号"作为文本限定符。我假设它会像这样导出数据,而它确实做到了:

,""Johnson"|Smith,Jones",

现在我正在测试将数据重新导入,使用双引号文本修饰符作为逗号分隔的格式。出现了 SSIS 无法找到分隔符的错误。我认为它应该将逗号和双引号的组合识别为更复杂的分隔符。

如果在输出中添加文本修饰符不能解决实际数据字符的问题,那么它有什么作用呢?

假设接收数据的人可能会使用像 Excel 这样的工具处理数据,但是似乎无法处理 |" 这样复杂的多字符分隔符,那么处理这种情况的最佳方式是从我的数据中删除最常见的分隔符,并将其用作分隔符。对于我来说可能是竖线,而不是逗号。

1个回答

5

文本限定符用于在行单元格中包含定界符的情况下。通常,文本限定符是双引号。如果单元格包含定界符并且未使用文本限定符,则定界符后发生的数据将溢出到下一列。从那里开始,数据行可能会激增,并且之后的任何列都不会对齐。这可能会造成真正的混乱。

此外,在应用程序(如Excel)中您看不到文本限定符。但是,如果您在Notepad ++中打开文件,则会看到文本限定符。文件中可能包含大量数据(例如文本限定符、换行符、列分隔符等),但在某些应用程序中不显示此数据。此类数据通常用于定义数据结构,而不是实际数据。

对于您的问题,您需要从源数据中删除双引号或使用其他文本限定符。您可以使用单引号,但是如果您有像Jones's这样的数据怎么办?这里的想法是文本限定符应该在定义数据结构方面是唯一的,这意味着您不能将文本限定符实际上作为数据的一部分(请参见Microsoft的注释-我强调)。

根据Microsoft的说法:

指定一个文本限定符。每个列都可以配置以识别文本限定符。将限定符字符嵌入已限定字符串中的方法由Flat File Connection Manager支持。双文本限定符实例被解释为该字符串的字面单一实例。例如,如果文本限定符是单引号,输入数据是'abc','def','g'hi',输出数据是abc,def,g'hi。但是,在限定字符串中嵌入限定符实例会导致Flat File Source失败,并显示错误DTS_E_PRIMEOUTPUTFAILED。

参考资料


1
很好的解释 +1 - Hadi
谢谢您的回复。如果“文本限定符用于在行单元格中包含分隔符的情况下”,我仍然不太确定为什么我首先要使用文本限定符,但是然后我必须从我的源数据中删除字符才能使其正常工作?虽然我确定它们存在的原因,但我还是没有理解。 - David Squires
有趣的是,在SSIS中,当我在导入过程中预览数据时,它实际上显示数据已经正确地导入到了不同的列中,但是最终还是出现了错误。 - David Squires
@DavidSquires 文本限定符应该在描述数据时是唯一的,而不应在数据字段中使用。在您的情况下,您的行单元格在数据中有一个文本限定符。因此,SSIS无法知道哪个是正确的。根据微软的评论,它将在UI中向您显示此信息,但在运行时将失败。至少,这就是我理解的方式。您是否尝试从数据字段中删除文本限定符? - J Weezy
1
@DavidSquires 这就是你要找的。为什么还没有接受答案呢? - Yahfoufi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接