SSIS 巧用 Script Component 写入XML

在SSIS中有一个叫做 Script. Component 的组件, 这里主要讲一下怎样利用这个组件用脚本语言将源数据写入 XML 文件.
首先介绍一下 Script. Component 脚本组件承载脚本,并使包能够包含和运行自定义的脚本代码。可以将包中的脚本组件用于下列目的:
  • 将多个转换应用于数据,而不是在数据流中使用多个转换。例如,脚本可以将两列中的值相加,然后计算和的平均值。
  • 访问现有 .NET 程序集中的业务规则。例如,脚本可以应用指定 Income 列中有效值范围的业务规则。
  • 除 Integration Services 表达式语法提供的函数和运算符之外,还可使用自定义公式和函数。例如,使用 LUHN 公式验证信用卡号。
  • 验证列数据,并跳过包含无效数据的记录。例如,脚本可以评估邮资额的合理性,并跳过金额过高或过低的记录。
脚本组件为将自定义函数纳入数据流提供了简便快捷的方法。但是,如果您计划在多个包中重新使用脚本代码,则应考虑编写自定义组件,而不使用脚本组件。
 
首先从Data Flow Transformations 的组件中拖动 Script. Component 组件到编辑区, 会弹出如下的对话框.
 
14321372_200903231121001.thumb.jpg
 

说明: 脚本组件可用作源、转换或目标。该组件支持一个输入和多个输出。根据其使用方式,该组件可以支持一个输入或多个输出,也可二者都支持。脚本由输入或输出中的每一行调用。

如果用作源,则脚本组件支持多个输出。
如果用作转换,则脚本组件支持一个输入和多个输出。
如果用作目标,则脚本组件支持一个输入。

 
以下的例子说明将 Script. Component  用作目标将平面文件的数据源写入XML文件.
14321372_200903231129491.thumb.jpg
 
这里的平面文件如下:
 
NAME;VALUE;DATE
A;1;1/1/2000
A;2;1/2/2000
A;3;1/3/2000
A;4;1/4/2000
A;5;1/5/2000
B;1;1/1/2000
B;2;1/2/2000
B;3;1/3/2000
B;4;1/4/2000
B;5;1/5/2000
C;1;1/1/2000
C;2;1/2/2000
C;3;1/3/2000
C;4;1/4/2000
C;5;1/5/2000
 
然后我们在 Script. Component  Inputs and Outputs 选项卡中添加 Input Columns: NAME,VALUE,DATE. Script. 选项卡中编写如下的代码:
 
' Microsoft SQL Server Integration Services user script. component
' This is your new script. component in Microsoft Visual Basic .NET
' ScriptMain is the entrypoint class for script. components
Imports System
Imports System.Data
Imports System.Math
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper
Imports Microsoft.SqlServer.Dts.Runtime.Wrapper
Imports System.IO
Imports System.Reflection
Public Class ScriptMain
    Inherits UserComponent
    Private targetFile As String
    Private xmlWriter As StreamWriter
    Private rootElement As String = "Root"
    Private rowElement As String = "Row"
    Public Overrides Sub AcquireConnections(ByVal Transaction As Object)
        targetFile = CType(Me.Connections.Destination.AcquireConnection(Nothing), String)
    End Sub
    Public Overrides Sub PreExecute()
        xmlWriter = New StreamWriter(targetFile, False)
        xmlWriter.WriteLine(FormatElement(rootElement))
    End Sub
    Public Overrides Sub PostExecute()
        xmlWriter.WriteLine(FormatElement(rootElement, True))
        xmlWriter.Close()
    End Sub

    Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
        Dim column As IDTSInputColumn90
        Dim rowType As Type = Row.GetType()
        Dim columnValue As PropertyInfo
        With xmlWriter
            .Write(FormatElement(rowElement))
            For Each column In Me.ComponentMetaData.InputCollection(0).InputColumnCollection
                columnValue = rowType.GetProperty(column.Name)
                .Write(FormatElement(column.Name) + columnValue.GetValue(Row, Nothing).ToString() + FormatElement(column.Name, True))
            Next
            .WriteLine(FormatElement(rowElement, True))
        End With
    End Sub
    Private Function FormatElement(ByVal elementName As String) As String
        Return FormatElement(elementName, False)
    End Function
    Private Function FormatElement(ByVal elementName As String, ByVal closingTag As Boolean) As String
        Dim returnValue As String
        If closingTag Then
            returnValue = ""
        Else
            returnValue = "        End If
        returnValue += elementName + ">"
        Return returnValue
    End Function
End Class
 
这样就OK了. 进行测试后文件成功写入XML中, 最终的XML文件如下:
 

A11/1/2000 12:00:00 AM
A21/2/2000 12:00:00 AM
A31/3/2000 12:00:00 AM
A41/4/2000 12:00:00 AM
A51/5/2000 12:00:00 AM
B11/1/2000 12:00:00 AM
B21/2/2000 12:00:00 AM
B31/3/2000 12:00:00 AM
B41/4/2000 12:00:00 AM
B51/5/2000 12:00:00 AM
C11/1/2000 12:00:00 AM
C21/2/2000 12:00:00 AM
C31/3/2000 12:00:00 AM
C41/4/2000 12:00:00 AM
C51/5/2000 12:00:00 AM
 
 
代码请大家到空间下载中自行下载.

fj.png3-23-2009 10-54-07 AM.jpg

fj.png3-23-2009 11-26-51 AM.jpg

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14321372/viewspace-573405/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/14321372/viewspace-573405/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值