【问题标题】:SSIS Bulk Insert where fields contain commas?SSIS批量插入字段包含逗号?
【发布时间】:2013-04-09 02:15:27
【问题描述】:

当字段包含逗号字符时,我在 SSIS 中的批量插入失败。我的平面文件源是制表符分隔的,并且在许多情况下,文本字段将包含逗号。例如,UserComment 可能有逗号。这会导致批量插入失败。

如何让 SSIS 忽略逗号?我认为它会自动发生,因为行分隔符是 {CR}{LF} 而列分隔符是“Tab”。为什么它在逗号处吠叫?另请注意,我目前没有使用格式文件。

提前致谢。

更新:
这是我在 SSIS 中遇到的错误:
错误:批量插入任务中的 0xC002F304,批量插入任务:发生错误并显示以下错误消息:“批量加载数据转换错误(类型不匹配或无效字符指定的代码页)第 183 行第 5 列(电子邮件地址)。批量加载数据转换错误(指定代码页的类型不匹配或无效字符)第 182 行第 5 列(电子邮件地址)。批量加载数据转换错误(类型不匹配或无效字符对于指定的代码页)第 181 行第 5 列(电子邮件地址)。”。 任务失败:批量插入任务

它似乎在记录 131988 上失败,这就是为什么我认为这是因为“某事,某事”电子邮件没有空间。 131988 之前的许多记录都很好。

131988  01  MEMPHIS, TN     someone@somewhere.com  
131988  02  NORTH LITTLE ROCK, AR       someone@somewhere.com,someone1@somewhere1.com  
131988  03  HOUSTON, TX     someone@somewhere.com,someone1@somewhere1.com  

【问题讨论】:

  • 它是否需要文本限定,例如,双引号或文本字段周围的东西?这与分隔符是制表符还是逗号的问题是分开的。
  • 查看更新。它不应该期待文本限定,我没有指定任何与此相关的任何内容或在任何内容周围使用双引号。
  • email,email 的三个记录(这可能是问题所在)。也超过目标列的长度。我认为会抛出截断错误而不是无效字符,但我会更改源代码并测试以确定它实际上是长度还是逗号。
  • 错误“指定代码页的类型不匹配或无效字符”具有误导性。我试图将数据写入源长度大于目标长度的字段。当我解决长度问题时,它起作用了。谢谢。
  • 我很高兴听到它成功了!我应该从“类型不匹配”部分猜到了。我反而走上了“无效字符”的报春花路径。赢得一些,失去一些......

标签: sql ssis


【解决方案1】:

我怀疑逗号或 @ 符号被称为“无效字符”。

我看到在包含电子邮件地址的字段之前的输入记录中有两个选项卡,因此电子邮件地址列将是第五列。但是当错误消息提到“第 5 列”时,它可能使用从零开始的索引,因此电子邮件列只有索引 4。是否有选项卡和另一列?可能存在无效字符。

我怀疑在导致错误的任何列中都嵌入了不可见的坏字符。在剪切和粘贴电子邮件地址行时,我经常会发现坏字符,所以这很可能是嫌疑人。

自行运行失败的行以确保它仍然失败。

然后将其复制到记事本中,并执行“另存为”,并将编码设置为 ANSI。 (如果有错误的字符,它可能会在那时抱怨。)使用“另存为”文件作为新的导入文件。此时,您应该能够合理地确信“所见即所得”,并且导入文件中没有嵌入不可见的字符。

如果这是问题所在,您将需要某种方法来验证未来的导入文件是否干净,或者在导入过程中以某种方式处理它们。

(我想你已经检查了目标列的长度是可以的。那肯定是个大问题。)

【讨论】:

  • 谢谢,但结果是长度问题。错误消息具有误导性。见上面我的cmets。不过,我对有用的评论投了赞成票。
【解决方案2】:

“指定代码页的类型不匹配或无效字符”是误导性错误消息。源表的字段长度超过了目标表的指定长度,因此出现错误。调整长度后,一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-28
    • 2023-04-03
    • 1970-01-01
    • 2023-03-29
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    相关资源
    最近更新 更多