在SSIS中有一个叫做 Script. Component 的组件, 这里主要讲一下怎样利用这个组件用脚本语言将源数据写入 XML 文件.
首先介绍一下 Script. Component 脚本组件承载脚本,并使包能够包含和运行自定义的脚本代码。可以将包中的脚本组件用于下列目的:
- 将多个转换应用于数据,而不是在数据流中使用多个转换。例如,脚本可以将两列中的值相加,然后计算和的平均值。
- 访问现有 .NET 程序集中的业务规则。例如,脚本可以应用指定 Income 列中有效值范围的业务规则。
- 除 Integration Services 表达式语法提供的函数和运算符之外,还可使用自定义公式和函数。例如,使用 LUHN 公式验证信用卡号。
- 验证列数据,并跳过包含无效数据的记录。例如,脚本可以评估邮资额的合理性,并跳过金额过高或过低的记录。
脚本组件为将自定义函数纳入数据流提供了简便快捷的方法。但是,如果您计划在多个包中重新使用脚本代码,则应考虑编写自定义组件,而不使用脚本组件。
首先从Data Flow Transformations 的组件中拖动 Script. Component 组件到编辑区, 会弹出如下的对话框.
说明: 脚本组件可用作源、转换或目标。该组件支持一个输入和多个输出。根据其使用方式,该组件可以支持一个输入或多个输出,也可二者都支持。脚本由输入或输出中的每一行调用。
如果用作源,则脚本组件支持多个输出。
如果用作转换,则脚本组件支持一个输入和多个输出。
如果用作目标,则脚本组件支持一个输入。
以下的例子说明将 Script. Component 用作目标将平面文件的数据源写入XML文件.
这里的平面文件如下:
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
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
' 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
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
Inherits UserComponent
Private targetFile As String
Private xmlWriter As StreamWriter
Private rootElement As String = "Root"
Private rowElement As String = "Row"
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
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
xmlWriter = New StreamWriter(targetFile, False)
xmlWriter.WriteLine(FormatElement(rootElement))
End Sub
Public Overrides Sub PostExecute()
xmlWriter.WriteLine(FormatElement(rootElement, True))
xmlWriter.Close()
End Sub
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
.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
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 + ">"
Dim returnValue As String
If closingTag Then
returnValue = ""
Else
returnValue = " End If
returnValue += elementName + ">"
Return returnValue
End Function
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
代码请大家到空间下载中自行下载.
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14321372/viewspace-573405/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/14321372/viewspace-573405/