将平面文件导入 SQL - 添加字符后不会抛出错误
Import Flat file to SQL - No error thrown after adding a character
我正在开发一个将文本文件中的数据加载到 SQL 服务器上的 table 的程序包。
文本文件包含以下格式的数据
我在这里包括平面文件连接管理器 -
我创建了一个测试 table
执行了包并将数据移动到 table。
然后编辑其中一列以包含更多字符(在第二列中包含 s)
而不是包出错..它 运行 成功并将额外的字符移动到下一列。
有人可以帮我吗?
为什么包没有抛出异常?
这是正常的,您正在阅读具有以下规格的固定宽度列(固定宽度或不规则右边)的平面文件源。
"Ragged Right", which is exactly the same as "Fixed Width", except that it gives you the option to insert a linefeed character (or CRLF, etc.) at the end of each line of data.
(您可以检查平面文件连接管理器以查看规格)
初始状态
数据:
0001aijn fkds jmcl wuj
规格和结果:
Col001: From 0 -> 3 '0001'
Col002: From 4 -> 7 'aijn'
Col003: From 8 -> 11 ' fkd'
Col004: From 12 -> 13 's '
Col005: From 14 -> 18 'jmcl '
Col006: From 19 -> end 'wuj'
第二状态
因此,当您添加 S
字符时,数据如下所示:
0001aijns fkds jmcl wuj
规格和结果:
Col001: From 0 -> 3 '0001'
Col002: From 4 -> 7 'aijn'
Col003: From 8 -> 11 's fk'
Col004: From 12 -> 13 'ds'
Col005: From 14 -> 18 ' jmcl'
Col006: From 19 -> end ' wuj'
更多信息:
- How to import a fixed width flat file into database using SSIS?
- SSIS Flat File Export - "Fixed Width" vs "Ragged Right"
是否有任何解决方法...在这种情况下它会抛出错误?
- 在平面文件连接管理器中使用
Delimited Format
- 转到“高级”选项卡,删除除一列以外的所有列
- 将数据类型更改为
DT_WSTR
,将长度更改为 4000
- 在数据流任务中添加平面文件源、条件拆分、脚本组件、派生列转换、OLEDB 目标,如下图所示
使用条件拆分根据列的长度过滤行:
LEN([Column0]) == 22
在脚本组件中写入以下代码(用于在行长度> 22 时引发错误):
Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
Throw New Exception("Length constraint violated")
End Sub
指定以下派生列
- 将结果映射到
OLEDB Destination
我看不出这两种情况的行为有什么不同。两次都是从输入文件中读取 4 个字符并将它们放入第 1 列,接下来的 4 个字符放入第 2 列,接下来的四个字符放入第 3 列,然后 2 个字符放入第 4 列,5 个字符放入第 5 列,最后第 6 列中的 4 个字符(如果还有那么多)。请注意,它将 space 算作字符,因此在第一个 运行 中,它包括 space 之间的 [=] 10=] 和 fkds
在第 3 列条目的开头,而在第二个 运行 中,额外的 s
现在是第 3 列中的第一个字符, space成为第二个字符。
您需要更新 SSIS 包以适应增加的长度。
为此,请右键单击您的目标目的地 - 显示高级编辑器:
检查并修复内部列的长度:
最后检查外部列的长度:
希望对您有所帮助:)
我正在开发一个将文本文件中的数据加载到 SQL 服务器上的 table 的程序包。
文本文件包含以下格式的数据
我在这里包括平面文件连接管理器 -
我创建了一个测试 table
执行了包并将数据移动到 table。
然后编辑其中一列以包含更多字符(在第二列中包含 s)
而不是包出错..它 运行 成功并将额外的字符移动到下一列。
有人可以帮我吗?
为什么包没有抛出异常?
这是正常的,您正在阅读具有以下规格的固定宽度列(固定宽度或不规则右边)的平面文件源。
"Ragged Right", which is exactly the same as "Fixed Width", except that it gives you the option to insert a linefeed character (or CRLF, etc.) at the end of each line of data.
(您可以检查平面文件连接管理器以查看规格)
初始状态
数据:
0001aijn fkds jmcl wuj
规格和结果:
Col001: From 0 -> 3 '0001'
Col002: From 4 -> 7 'aijn'
Col003: From 8 -> 11 ' fkd'
Col004: From 12 -> 13 's '
Col005: From 14 -> 18 'jmcl '
Col006: From 19 -> end 'wuj'
第二状态
因此,当您添加 S
字符时,数据如下所示:
0001aijns fkds jmcl wuj
规格和结果:
Col001: From 0 -> 3 '0001'
Col002: From 4 -> 7 'aijn'
Col003: From 8 -> 11 's fk'
Col004: From 12 -> 13 'ds'
Col005: From 14 -> 18 ' jmcl'
Col006: From 19 -> end ' wuj'
更多信息:
- How to import a fixed width flat file into database using SSIS?
- SSIS Flat File Export - "Fixed Width" vs "Ragged Right"
是否有任何解决方法...在这种情况下它会抛出错误?
- 在平面文件连接管理器中使用
Delimited Format
- 转到“高级”选项卡,删除除一列以外的所有列
- 将数据类型更改为
DT_WSTR
,将长度更改为4000
- 在数据流任务中添加平面文件源、条件拆分、脚本组件、派生列转换、OLEDB 目标,如下图所示
使用条件拆分根据列的长度过滤行:
LEN([Column0]) == 22
在脚本组件中写入以下代码(用于在行长度> 22 时引发错误):
Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer) Throw New Exception("Length constraint violated") End Sub
指定以下派生列
- 将结果映射到
OLEDB Destination
我看不出这两种情况的行为有什么不同。两次都是从输入文件中读取 4 个字符并将它们放入第 1 列,接下来的 4 个字符放入第 2 列,接下来的四个字符放入第 3 列,然后 2 个字符放入第 4 列,5 个字符放入第 5 列,最后第 6 列中的 4 个字符(如果还有那么多)。请注意,它将 space 算作字符,因此在第一个 运行 中,它包括 space 之间的 [=] 10=] 和 fkds
在第 3 列条目的开头,而在第二个 运行 中,额外的 s
现在是第 3 列中的第一个字符, space成为第二个字符。
您需要更新 SSIS 包以适应增加的长度。
为此,请右键单击您的目标目的地 - 显示高级编辑器:
检查并修复内部列的长度:
最后检查外部列的长度:
希望对您有所帮助:)