【问题标题】:SSIS Flat File Source Text Qualifier being ignoredSSIS 平面文件源文本限定符被忽略
【发布时间】:2015-09-05 10:49:01
【问题描述】:

我正在使用 SSIS 将数据从平面文件插入数据库。

我为此创建了数据流任务。我使用平面文件作为源和 ADO NET 目标来插入数据。

下面是我的平面文件源设置的样子。

下面是我的“列”标签的样子

当我使用投标和数据正确插入数据库时​​,这工作正常。它甚至可以在本地运行时与 DTEXEC.EXE 一起使用。

现在,问题在于使用 dtexec.exe 在服务器上执行包。在服务器上,数据已正确插入,但在将数据插入数据库时​​完全忽略了给出的文本限定符(双引号)。在本地运行时,同样的工作完全正常。我附上了下面的图片,了解它是如何存储在数据库中的。

我已经在本地和远程服务器上检查了 SQL SERVER 版本和 SSIS 版本,两者都是相同的。

可能是什么问题?有人可以帮忙吗?

【问题讨论】:

  • 原始数据在记事本中是什么样子的?
  • @EricHauenstein:看起来像 " 11111118","Test ","Test ","04/08/1997","12/31/2018"跨度>

标签: sql-server ssis


【解决方案1】:

在平面文件源中,单击“列”。确保在预览数据时预览中没有引号。否则,您可能必须回头查看文件并确保文本限定符和分隔符都正确。

如果这不起作用,请同时截取“列”屏幕的屏幕截图并发布。实际文件布局的屏幕截图也会有所帮助。希望这会有所帮助!

【讨论】:

  • 我已将“列”选项卡添加到我的问题中。而且我已经检查过了,当我看到预览选项卡时没有引号。正如我所说,它在本地工作正常,但在服务器上出现问题。
【解决方案2】:

在您的平面文件连接管理器中,在“高级”选项中,您应该可以看到每个字段的不同参数。您将看到每个字段都有一个名称、ColumnDelimiter、一堆淡出的字段和 DataType 以及是否为文本限定的选项。

在那里,您应该通过将 TextQualified 选项设置为 true 来指定您希望确定为文本限定的列。

【讨论】:

  • 我已经检查过了,并且所有列的 TextQualified 选项都设置为 true
  • 检查操作系统之间是否存在差异,明确是否存在 32 位或 64 位的差异。我已经看到存在类似的问题,因为 32 位的开发环境在 64 位服务器上运行时存在完全相同的问题。
  • 是的,我已经检查过了,看起来我有同样的问题,32 位和 64 位。当我在本地使用 64 位 DTExec.exe 运行包时,它插入了错误的数据(带双引号的数据),而使用 32 位 DTExec.exe 时同样可以正常工作。我的服务器设置为 64 位。你能告诉我你是怎么解决这个问题的吗?
  • 我更改了文件的格式并使用 bcp 来解决这个问题。这是 SSIS 的巨大缺陷之一。 BIDS 并不像他们所说的那样完全支持正确的 CSV 格式。 CSV 也不是数据传输的最佳文件格式。我强烈建议使用更完整的数据保存格式,或者您可以使用 bcp 命令并创建格式文件。如果您有标题行,这将起作用:将定界符指定为 '","' 并将行定界符指定为 '\r\n"'。
  • 或 '\n"' 如果您出于某种原因使用 linux 行尾。我知道这是一个 hack,这就是为什么我的第一个建议是采用不同的格式,但它确实有效。您还可以利用数据转换从数据流中的每一列中删除引号。我从来没有这样做过,但现在想起来了。祝你好运。
【解决方案3】:

所以我找到了解决这个问题的方法。感谢 LukeBI 回复 here

创建一个名为 TextQualifier 的字符串变量并赋值为 "(双引号)

选择连接管理器,然后在“属性”窗口中选择“表达式”。见下文。

单击...,添加属性“TextQualifier”并分配变量@[User::TextQualifier]。见下图

现在它工作正常。它现在甚至可以在 64 位操作系统上运行。

【讨论】:

    猜你喜欢
    • 2014-10-16
    • 2019-10-11
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多