用于修剪前导/尾随空格的所有输入列的VB.Net SSIS脚本
我有一个SSIS包,它将数据从平面文件输入到SQL 2008数据库表中。第三方每天生成平面文件(.csv)。我需要删除的每个字段中都有前导空格 我以为一个脚本组件就可以做到这一点 我想让它遍历所有的输入列,并遍历每列的所有值 我在这里找到了这个代码: 但是,我不知道如何更改它来修剪值? 我试着换衣服 “属性值。ToUpper()”到“属性值。Trim()” 但是,它会在组件“error 30203:需要标识符…”上导致错误 请帮忙 以下是我的SSIS数据流: 平面文件>数据转换>脚本组件>OLE DB目标用于修剪前导/尾随空格的所有输入列的VB.Net SSIS脚本,vb.net,sql-server-2008,ssis,trim,script-component,Vb.net,Sql Server 2008,Ssis,Trim,Script Component,我有一个SSIS包,它将数据从平面文件输入到SQL 2008数据库表中。第三方每天生成平面文件(.csv)。我需要删除的每个字段中都有前导空格 我以为一个脚本组件就可以做到这一点 我想让它遍历所有的输入列,并遍历每列的所有值 我在这里找到了这个代码: 但是,我不知道如何更改它来修剪值? 我试着换衣服 “属性值。ToUpper()”到“属性值。Trim()” 但是,它会在组件“error 30203:需要标识符…”上导致错误 请帮忙 以下是我的SSIS数据流: 平面文件>数据转换>脚本组件>OLE
”此脚本调整所有字符串字段的值
导入系统
导入系统数据
导入系统。数学
导入系统。添加了“反射”
导入Microsoft.SqlServer.Dts.Pipeline.Wrapper
导入Microsoft.SqlServer.Dts.Runtime.Wrapper
_
_
公共类ScriptMain
继承用户组件
'方法,该方法将为数据流中的每个记录启动
公共覆盖子Input0\u进程InputRow(ByVal行作为Input0Buffer)
'使用反射循环行的所有属性:
例如:
'行。字段1(字符串)
'Row.Field1_为空(布尔值)
'行。字段2(字符串)
'Row.Field2_为空(布尔值)
Dim p作为属性info
对于行中的每个p.GetType().GetProperties()
'对所有字符串属性执行操作:Row.Field1、Row.Field2等。
如果p.PropertyType是GetType(String),那么
'使用方法设置每个字符串类型属性的值
'确保新值的长度不超过列大小
p、 SetValue(行,DoSomething(p.GetValue(行,无).ToString()),无)
如果结束
下一个
端接头
“您可以根据需要进行调整的新功能
作为字符串的公共函数DoSomething(属性的ByVal值作为字符串)
'大写的值
ValueOfProperty=ValueOfProperty.ToUpper()'可能会将其更改为Trim()?
财产的返回值
端函数
末级
我认为您可以通过数据转换任务而不是SSIS中的脚本任务来实现这一点。我认为这可能更简单,您可以简单地在每个列上应用一个表达式进行修剪,或者向集合中添加一个新列并替换旧列,或者更新同一列返回的值,然后供下一个数据流任务使用
我个人认为这将在GUI拖拽中做得更好一点,在那种情况下你就不必考虑脚本任务了。只有要使用的表达式,我正在链接一些MSDN文档。然后,可以根据平面文件数据源中的每列显式设置它
MSDN上的Trim文档:
不要在这台家用机器上安装SSDT或VSBI,否则我会设置一个简单的数据流示例并截图
另一篇关于SSIS中修剪的看似有用的文章:我找到了如何让脚本使用For Each循环修剪所有值的方法。当您有很多列,或者希望对多个包使用相同的解决方案时,这会很有帮助 正如Dinglemeyer和Jim在评论中所说的,缺点是SSI不会反映脚本本身所发生的事情。我在下面介绍了使用派生列对象的替代方法 替代方法: 使用衍生列对象
回答:自动修剪脚本
<microsoft .sqlserver.dts.pipeline.ssisscriptcomponententrypointattribute=".sqlserver.dts.pipeline.ssisscriptcomponententrypointattribute"> _
<clscompliant false="false">
_
这导致=“.sqlserver上出现错误。我删除了这两行
谢谢,希望有人能找到
Imports System
Imports System.Data
Imports System.Math
Imports System.Reflection ' Added
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper
Imports Microsoft.SqlServer.Dts.Runtime.Wrapper
Public Class ScriptMain
Inherits UserComponent
Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
'
' Use Reflection to loop through all the properties of Row:
' Example:
' Row.Field1 (String)
' Row.Field1_IsNull (Boolean)
' Row.Field2 (String)
' Row.Field2_IsNull (Boolean)
Dim p As PropertyInfo
For Each p In Row.GetType().GetProperties()
' Do something for all string properties: Row.Field1, Row.Field2, etc.
If p.PropertyType Is GetType(String) Then
' Use a method to set the value of each String type property
' Make sure the length of the new value doesn't exceed the column size
If (p.CanWrite) Then p.SetValue(Row, DoSomething(p.GetValue(Row, Nothing).ToString()), Nothing)
End If
Next
'
End Sub
' New function that you can adjust to suit your needs
Public Function DoSomething(ByVal ValueOfProperty As String) As String
' Uppercase the value
'ValueOfProperty = ValueOfProperty.ToUpper()
'Trim Leading (LTrim) and Trailing (RTrim) Whitespace
'Change this to equal any normal expression
ValueOfProperty = LTrim(RTrim(ValueOfProperty))
Return ValueOfProperty
End Function
End Class
<microsoft .sqlserver.dts.pipeline.ssisscriptcomponententrypointattribute=".sqlserver.dts.pipeline.ssisscriptcomponententrypointattribute"> _
<clscompliant false="false">