Ssis 如何将T-SQL语句的结果集添加到数据流?

Ssis 如何将T-SQL语句的结果集添加到数据流?,ssis,Ssis,我有一个简单的SSIS包,我想把它复杂一点 现在,它在OLEDB源中执行一个存储过程,并将存储过程返回的行添加到数据流中。然后,对于返回的每一行,它执行OLEDB命令转换,执行第二个存储过程(在第二个数据库中),将源中的列作为参数传递 第二个存储过程执行同步功能,我想记录添加、删除和更新的总数。“sync”存储过程使用MERGE语句的OUTPUT子句获取此数据并将其作为resultset返回 我看不到从OLE DB命令转换中获取此结果集的方法。它不允许我添加输出列 除了添加脚本转换之外,还有什

我有一个简单的SSIS包,我想把它复杂一点

现在,它在OLEDB源中执行一个存储过程,并将存储过程返回的行添加到数据流中。然后,对于返回的每一行,它执行OLEDB命令转换,执行第二个存储过程(在第二个数据库中),将源中的列作为参数传递

第二个存储过程执行同步功能,我想记录添加、删除和更新的总数。“sync”存储过程使用MERGE语句的OUTPUT子句获取此数据并将其作为resultset返回

我看不到从OLE DB命令转换中获取此结果集的方法。它不允许我添加输出列


除了添加脚本转换之外,还有什么方法可以让我记录添加、删除和更新列的总数吗?

这并不像应该的那样简单。否则我需要回到SSIS类

OLE DB命令组件无法向数据流添加新行,因为它是一个同步组件

它也不能向数据流添加新列。这是第一件非直觉的事情。您将在我的源代码中看到,我添加了一个ActionName列,类型为nvarchar(10)/字符串长度为10。如果愿意,可以在OLEDB命令组件之前的派生列转换中添加该列

因为我不能向数据流添加行,这意味着我只能为proc使用输出参数,而不是使用它可以生成的记录集。也许您的存储过程一次只允许修改一行,这没关系,但对我来说有一种通用的代码味道

表定义和设置 存储过程 OLE DB命令设置 后果

工具书类
Biml 假设您有免费软件包,则使用以下Biml生成此软件包

<Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <Connections>
        <OleDbConnection Name="CM_OLE" ConnectionString="Data Source=localhost\dev2014;Initial Catalog=tempdb;Provider=SQLNCLI10.1;Integrated Security=SSPI;Auto Translate=False;" />
    </Connections>
    <Packages>
        <Package ConstraintMode="Linear" Name="so_27932430">
            <Variables>
                <Variable DataType="String" Name="QuerySource">
                    <![CDATA[SELECT
    D.SourceId
,   D.SourceValue
,   CAST(NULL AS nvarchar(10)) AS ActionName
FROM
(
    VALUES
        (1, 'No change')
    ,   (2, 'I am new')
    ,   (3,'I Changed')
) D(SourceId, SourceValue);
]]></Variable>
                <Variable DataType="String" Name="QueryCommand">EXECUTE dbo.merge_27932430 @SourceId = ?, @SourceValue = ?, @ActionName = ? OUTPUT;</Variable>
            </Variables>
            <Tasks>
                <Dataflow Name="DFT OLEDB Test">
                    <Transformations>
                        <OleDbSource ConnectionName="CM_OLE" Name="OLESRC GenData">
                            <VariableInput VariableName="User.QuerySource" />
                        </OleDbSource>
                        <OleDbCommand ConnectionName="CM_OLE" Name="OLECMD Test">
                            <DirectInput>EXECUTE dbo.merge_27932430 @SourceId = ?, @SourceValue = ?, @ActionName = ? OUTPUT;</DirectInput>
                            <Parameters>
                                <Parameter SourceColumn="SourceId" DataType="Int32" TargetColumn="@SourceId"></Parameter>
                                <Parameter SourceColumn="SourceValue" DataType="AnsiString" Length="20" TargetColumn="@SourceValue"></Parameter>
                                <Parameter SourceColumn="ActionName" DataType="String" Length="10" TargetColumn="@ActionName"></Parameter>
                            </Parameters>
                        </OleDbCommand>
                        <DerivedColumns Name="DER PlaceHolder" />
                    </Transformations>
                </Dataflow>
            </Tasks>
        </Package>
    </Packages>
</Biml>

执行dbo.merge_2793430@SourceId=?,@SourceValue=?,@ActionName=?输出
执行dbo.merge_2793430@SourceId=?,@SourceValue=?,@ActionName=?输出

谢谢。我在这里可能会走运。存储过程的输出仅用于记录添加、删除和不匹配的行数。听起来它可以使用三个输出参数。正如你所说,这并不理想。如果我真的需要返回多个行(我几乎要返回),那么它就不起作用了。
CREATE PROCEDURE
    dbo.merge_27932430
(
    @SourceId int
,   @SourceValue varchar(20)
,   @ActionName nvarchar(10) OUTPUT
)
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE
        @BloodyHack table
    (
        ActionName nvarchar(10) NOT NULL
    ,   SourceId int NOT NULL
    );

    MERGE
        dbo.so_27932430 AS T
    USING
    (
        SELECT
            D.SourceId
        ,   D.SourceValue
        FROM
        (
            SELECT @SourceId, @SourceValue
        ) D(SourceId, SourceValue)
    ) AS S
    ON
    (
        T.SourceId = S.SourceId
    )
    WHEN
        MATCHED 
            AND T.SourceValue <> S.SourceValue
        THEN
        UPDATE
        SET
            T.SourceValue = S.SourceValue
    WHEN
        NOT MATCHED THEN
        INSERT
        (
            SourceId
        ,   SourceValue
        )
        VALUES
        (
            SourceId
        ,   SourceValue
        )
    OUTPUT 
        $action, S.SourceId
    INTO
        @BloodyHack;

    /* Pick one, any one*/
    SELECT
        @ActionName = BH.ActionName
    FROM
        @BloodyHack AS BH

END
SELECT
    D.SourceId
,   D.SourceValue
,   CAST(NULL AS nvarchar(10)) AS ActionName
FROM
(
    VALUES
        (1, 'No change')
    ,   (2, 'I am new')
    ,   (3,'I Changed')
) D(SourceId, SourceValue);
EXECUTE dbo.merge_27932430 @SourceId = ?, @SourceValue = ?, @ActionName = ? OUTPUT;
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <Connections>
        <OleDbConnection Name="CM_OLE" ConnectionString="Data Source=localhost\dev2014;Initial Catalog=tempdb;Provider=SQLNCLI10.1;Integrated Security=SSPI;Auto Translate=False;" />
    </Connections>
    <Packages>
        <Package ConstraintMode="Linear" Name="so_27932430">
            <Variables>
                <Variable DataType="String" Name="QuerySource">
                    <![CDATA[SELECT
    D.SourceId
,   D.SourceValue
,   CAST(NULL AS nvarchar(10)) AS ActionName
FROM
(
    VALUES
        (1, 'No change')
    ,   (2, 'I am new')
    ,   (3,'I Changed')
) D(SourceId, SourceValue);
]]></Variable>
                <Variable DataType="String" Name="QueryCommand">EXECUTE dbo.merge_27932430 @SourceId = ?, @SourceValue = ?, @ActionName = ? OUTPUT;</Variable>
            </Variables>
            <Tasks>
                <Dataflow Name="DFT OLEDB Test">
                    <Transformations>
                        <OleDbSource ConnectionName="CM_OLE" Name="OLESRC GenData">
                            <VariableInput VariableName="User.QuerySource" />
                        </OleDbSource>
                        <OleDbCommand ConnectionName="CM_OLE" Name="OLECMD Test">
                            <DirectInput>EXECUTE dbo.merge_27932430 @SourceId = ?, @SourceValue = ?, @ActionName = ? OUTPUT;</DirectInput>
                            <Parameters>
                                <Parameter SourceColumn="SourceId" DataType="Int32" TargetColumn="@SourceId"></Parameter>
                                <Parameter SourceColumn="SourceValue" DataType="AnsiString" Length="20" TargetColumn="@SourceValue"></Parameter>
                                <Parameter SourceColumn="ActionName" DataType="String" Length="10" TargetColumn="@ActionName"></Parameter>
                            </Parameters>
                        </OleDbCommand>
                        <DerivedColumns Name="DER PlaceHolder" />
                    </Transformations>
                </Dataflow>
            </Tasks>
        </Package>
    </Packages>
</Biml>