Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于修剪前导/尾随空格的所有输入列的VB.Net SSIS脚本_Vb.net_Sql Server 2008_Ssis_Trim_Script Component - Fatal编程技术网

用于修剪前导/尾随空格的所有输入列的VB.Net SSIS脚本

用于修剪前导/尾随空格的所有输入列的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

我有一个SSIS包,它将数据从平面文件输入到SQL 2008数据库表中。第三方每天生成平面文件(.csv)。我需要删除的每个字段中都有前导空格

我以为一个脚本组件就可以做到这一点

我想让它遍历所有的输入列,并遍历每列的所有值

我在这里找到了这个代码:

但是,我不知道如何更改它来修剪值?

我试着换衣服 “属性值。ToUpper()”到“属性值。Trim()” 但是,它会在组件“error 30203:需要标识符…”上导致错误

请帮忙

以下是我的SSIS数据流:

平面文件>数据转换>脚本组件>OLE DB目标

”此脚本调整所有字符串字段的值
导入系统
导入系统数据
导入系统。数学
导入系统。添加了“反射”
导入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不会反映脚本本身所发生的事情。我在下面介绍了使用派生列对象的替代方法

替代方法:

使用衍生列
对象

  • 在派生列转换编辑器中的“派生列”下,使用下拉列表选择替换“您的列名称”

  • 在“表达式”下,键入要应用于该列的表达式,即LTRIM(RTRIM(您的列名称))

  • 唯一的缺点是您必须手动输入每一列。如果有很多列,这可能是一个漫长的过程


    回答:自动修剪脚本

  • 在SSIS中的源和目标之间添加脚本组件。我在数据转换后添加了我的
  • 编辑脚本组件。仅从上一个任务对象中选择输出列。在我的例子中,数据转换的输出列。将每列更改为“ReadWrite
  • 选择脚本,然后选择设计脚本

  • 复制/粘贴以下代码。保存并运行

  • 可以将脚本中的此行修改为任何其他正常表达式:

    ValueOfProperty=LTrim(RTrim(ValueOfProperty))

    一些错误:

    “任务配置为预编译脚本,但未找到二进制代码。请访问IDE…” 这是一个错误。进入脚本并删除“End Class”。拯救将“End Class”添加回脚本底部,然后再次保存

    未找到属性方法。 添加了“CanWrite”if/then语句。确保将列设置为ReadWrite,否则将跳过这些列

    错误30203:需要标识符 确保在脚本组件的“输入列”下选择的列有效。在我的例子中,它显示了在这个脚本组件之前数据转换的输入和输出的所有列。需要是上一个数据流对象的输出,因此只选择那些列

    最初的代码是这样的:

    <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">