SSIS平面文件源文本限定符被忽略。

5
我正在使用SSIS将数据从平面文件插入到数据库中。我创建了Data Flow Task来实现此操作,使用Flat File作为Source和ADO NET Destination来插入数据。
下面是Flat File Source的设置方式: Flat File Settings 下面是“Columns”选项卡的样子: ColumnsTab 当我在BIDS中运行时,可以正常插入数据到数据库中。而且,当我在本地运行DTEXEC.EXE时,也能正常工作。
但是,使用dtexec.exe在服务器上执行软件包时就会出现问题。在服务器上可以正确地插入数据,但是给定的文本限定符(双引号)完全被忽略了。而当我在本地运行时,它可以很好地工作。 如下图所示,这是数据存储在数据库中的方式: Data Inserted into Database 我已经检查了本地和远程服务器上的SQL SERVER版本和SSIS版本,两者都相同。
这可能出现了什么问题?有人可以帮助吗?

记事本中的原始数据是什么样子? - Eric Hauenstein
@EricHauenstein:看起来像是 **" 11111118","测试 ","测试 ","04/08/1997","12/31/2018"**。 - Sanjay Panchal
3个回答

4
我找到了这个问题的解决方案。感谢LukeBI的答案在这里
创建一个名为TextQualifier的字符串变量,并将值赋为“(双引号)”。
选择连接管理器,在属性窗口中选择“表达式”。如下图所示。

Expressions property

点击 ...,添加属性 'TextQualifier' 并将变量 @[User::TextQualifier] 赋值。请参见下图。

Add Property

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

1
在平面文件源中,点击“列”。确保在预览数据时,预览中没有引号。否则,您可能需要回到文件中,确保文本限定符和分隔符都是正确的。
如果这样做不起作用,请也截取“列”屏幕的截图并发布。实际文件布局的截图也会有所帮助。希望对您有所帮助!

我已经在我的问题中添加了“列”选项卡。我已经检查过,在预览选项卡中没有引号。正如我所说,它在本地工作正常,但在服务器上出现问题。 - Sanjay Panchal

1
在您的“平面文件连接管理器”中,进入“高级”选项,您将看到每个字段的不同参数视图。对于每个字段,您将看到它有一个名称、列分隔符、一堆淡化的字段以及数据类型和文本限定的选择。在这里,您应该通过将“TextQualified”选项设置为“true”,来指定您希望确定为文本限定的列。

Notice it is false in this example


我已经检查过,所有列的TextQualified选项都设置为true - Sanjay Panchal
1
检查操作系统之间是否存在差异,特别是在32位或64位方面是否有差异。我曾经遇到过类似的问题,因为开发环境是32位,在64位服务器上运行时会出现完全相同的问题。 - eddiecubed
是的,我已经检查过了,看起来我也有同样的问题,32位与64位。当我在本地使用64位的DTExec.exe运行包时,它会插入错误的数据(带双引号的数据),而使用32位的DTExec.exe时则正常工作。我的服务器设置为64位。您能告诉我您是如何解决这个问题的吗? - Sanjay Panchal
我更改了文件格式并利用bcp来解决这个问题。这是SSIS的一个巨大缺陷之一。BIDS并没有完全支持适当的CSV格式,正如他们所说的那样。CSV也不是最好的数据传输文件格式。我强烈建议使用更具数据完整性的格式,或者您可以使用bcp命令并创建格式文件。如果您有标题行,则可以指定分隔符为'","',行分隔符为'\r\n"'. - eddiecubed
我知道这是一种hack方法,这也是为什么我的第一个建议是采用不同的格式路线,但它确实有效。您还可以利用数据转换从数据流中删除每个列中的引号。我从未尝试过这样做,但现在正在考虑。祝你好运。 - eddiecubed
感谢您的努力。我已经解决了这个问题并添加了一个答案。但是非常感谢您的努力。 - Sanjay Panchal

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