【问题标题】:Can't get data to flow correctly in SSIS无法让数据在 SSIS 中正确流动
【发布时间】:2013-08-30 13:06:05
【问题描述】:

我在让我的数据流按照我的意愿行事时遇到了一些问题。

我正在使用一个 OLEDB 源,它调用一个存储过程,该存储过程使用一个表变量来显示我需要使用的数据。 它看起来像这样:

ClientID    TimeStamp            IsStart
pic@psdfj   2013-08-28 14:22:59     1
bsd@fjskk   2013-08-28 14:43:21     1
pic@psdfj   2013-08-28 15:23:01     0
..and so on

我需要创建两个新列,一个带有时间戳,另一个带有 IsStart 列。 (我正在跟踪用户何时在线并捕获时间戳。) 所以我的 SQL Server 数据库中有一个名为 tblUserUsage 的当前空表,其中包含以下列:

tblUserUsage (example of what the data would look like)
TimeStamp           NumberOfUsers
2013-08-28 14:22:59       1
2013-08-28 14:43:21       2
2013-08-28 15:23:01       1

我在将数据流输出到这些列时遇到问题。现在我将存储过程调用连接到派生列,然后连接到脚本。但这不起作用,因为当我创建输出列时,它不允许我输出到脚本中的输出缓冲区。只是为了澄清 - 脚本将在 VB.NET 中

这是我的脚本到目前为止的样子。我在输出中添加了 NumberOfUsers 列。但我仍然没有 Output0buffer

有人有什么想法吗?

【问题讨论】:

  • 你能发布你的脚本吗?如果它太长至少发布输出部分。这可能会让我们知道发生了什么
  • 我有一些基本的 if 语句会增加小时数,但由于某种原因我没有输出缓冲区?我不确定为什么在 SSIS 包的另一部分中我有一个脚本并且我有一个输出缓冲区。但是这个没有......我基本上只是将时间戳和更新的用户数量放入数据库中的表中。
  • 您要创建什么样的脚本? (源,转换...)我记得,目标脚本没有输出列..也许就是这样?
  • 这是一个转换脚本。
  • 这是同步变换还是异步变换? (您只会在代码中为异步转换生成一个 OutputBuffer;比较 MSDN 文章 Creating an Asynchronous Transformation with the Script ComponentCreating a Synchronous Transformation with the Script Component。)

标签: ssis bids


【解决方案1】:

您只会在代码中为 异步 转换生成一个 OutputBuffer(其中一个或多个输出的 SynchronousInputID 属性设置为零)。对于同步转换,您的输出列将位于 InputBuffer 中。

比较 MSDN 文章 Creating an Asynchronous Transformation with the Script ComponentCreating a Synchronous Transformation with the Script Component

【讨论】:

    【解决方案2】:

    您是否像这样在输出中添加了一列?

    那么您的输出缓冲区将如下所示:

    TableOutputBuffer.OutputColumnName = "你好";

    看看我找到的这个示例here,也许可以将它与你的代码进行比较。我通常用 c# 编写我的脚本,所以我可以告诉你是否遗漏了我脑海中的任何东西,但它可能值得一试。

        Public Class ScriptMain
    Inherits UserComponent
    
    Dim connMgr As IDTSConnectionManager100
    Dim sqlConn As SqlConnection
    Dim sqlReader As SqlDataReader
    
    Public Overrides Sub AcquireConnections(ByVal Transaction As Object)
    
        connMgr = Me.Connections.MyADONETConnection
        sqlConn = CType(connMgr.AcquireConnection(Nothing), SqlConnection)
    
    End Sub
    
    Public Overrides Sub PreExecute()
    
        Dim cmd As New SqlCommand("SELECT AddressID, City, StateProvinceID FROM Person.Address", sqlConn)
        sqlReader = cmd.ExecuteReader
    
    End Sub
    
    Public Overrides Sub CreateNewOutputRows()
    
        Do While sqlReader.Read
            With MyAddressOutputBuffer
                .AddRow()
                .AddressID = sqlReader.GetInt32(0)
                .City = sqlReader.GetString(1)
            End With
        Loop
    
    End Sub
    
    Public Overrides Sub PostExecute()
    
        sqlReader.Close()
    
    End Sub
    
    Public Overrides Sub ReleaseConnections()
    
        connMgr.ReleaseConnection(sqlConn)
    
    End Sub
    
    End Class
    

    【讨论】:

    • 是的,我做了 TsSkTo。我已经添加了输出列名,但由于某种原因,缓冲区包装器中的代码中没有生成输出缓冲区。我不确定为什么。我已经多次重新创建我的脚本,但无济于事。
    • 回答你的问题 TsSkTo,在 VB 中它与你不必使用 SqlConnection 或 DataReader 的事实有点不同(也许这就是我在数据流任务),但代码没有生成 Sub CreateNewOutputRows(),也没有为我在输出中创建的列生成输出缓冲区。我完全被难住了,因为我在同一个包的不同数据流中有几乎相同的脚本,而且它完全没有任何问题。所以我完全被难住了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多