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

How to Add the Result Set from a T-SQL Statement to a Data Flow?

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

现在,它在 OLE DB 源中执行存储过程,并将从存储过程中编辑的行 return 添加到数据流中。然后,对于 returned 的每一行,它执行 OLE DB 命令转换,执行第二个存储过程(在第二个数据库中),将来自源的列作为参数传递。

第二个存储过程执行同步功能,我想记录增删改查的总计。 "sync" 存储过程使用 MERGE 语句的 OUTPUT 子句获取此数据并将其 return 作为结果集。

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

如果不添加脚本转换,是否有办法记录添加、删除和更新列的总计?

这并不像它应该的那样直截了当。那或者我需要回到 SSIS class.

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

它也无法向数据流中添加新列。那是 non-intuitive 的第一件事。所以你会在我的源代码中看到,我添加了一个类型为 nvarchar(10)/字符串长度为 10 的 ActionName 列。如果你愿意,你可以在 OLE DB 命令组件之前的派生列转换中添加该列。

由于我无法向数据流中添加行,这意味着我只能为我的过程使用 OUTPUT 参数,而不是使用它可以生成的记录集。也许您的存储过程一次只允许更改一行,这没关系,但对我来说有一种普遍的代码味道。

Table定义和设置

CREATE TABLE dbo.so_27932430
(
    SourceId int NOT NULL
,   SourceValue varchar(20) NOT NULL
);
GO
INSERT INTO
    dbo.so_27932430
(SourceId, SourceValue)
VALUES
    (1, 'No change')
,   (3,'Changed');

存储过程

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);

OLE DB 命令设置

EXECUTE dbo.merge_27932430 @SourceId = ?, @SourceValue = ?, @ActionName = ? OUTPUT;

结果

参考资料

比姆

假设你有免费的 BidsHelper 下面的 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>