捕获事务中受影响的第一行并分配给SSIS变量

时间:2015-12-23 20:59:55

标签: sql-server ssis sql-server-2012 ssms ssis-2012

我正在SSIS $ ./script.sh [Usage] $ ./script.sh --scan Specify scan type $ ./script.sh --help --scan [Usage] $ ./script.sh --scan short Specify keyword to search $ ./script.sh --scan short keyword [Starts short scanning for "keyword" - go to function where my script is, blah, blah] $ ./script.sh keyword --scan short [As above] $ ./script.sh keyword [Usage] 任务中运行以下T-SQL语句:

Execute T-SQL Statement

当从SSMS中运行脚本时,它会返回两个计数:

  

(69行(s)受影响)

     

(217行(s)受影响)

如何捕获第一个计数并将其分配给SSIS变量?在这种情况下,BEGIN TRANSACTION BEGIN TRY INSERT FooTable (...) SELECT ... FROM FooTableStaging ts WHERE NOT EXISTS ( SELECT id FROM FooTable WHERE id=ts.id ); -- reset staging table DELETE FROM FooTableStaging ; COMMIT TRANSACTION END TRY BEGIN CATCH ROLLBACK TRANSACTION ... END CATCH 不会等于217吗?

**编辑**

使用@@ROWCOUNT连接类型。

1 个答案:

答案 0 :(得分:2)

可能有几种方法可以做到,但我认为最简单的方法是在脚本中添加以下3个新行

-- line 1  Make a variable to hold the desired value
DECLARE @NewRowCount int;
BEGIN TRANSACTION
BEGIN TRY

    INSERT  FooTable (...)
    SELECT  ...
    FROM    FooTableStaging ts
    WHERE NOT EXISTS (
        SELECT  id
        FROM    FooTable
        WHERE   id=ts.id
    );

    -- Line 2  Capture the intended count
    SELECT @NewRowCount = @@ROWCOUNT;

    -- reset staging table
    DELETE
    FROM    FooTableStaging
    ;

    COMMIT TRANSACTION

END TRY
BEGIN CATCH
    ROLLBACK TRANSACTION
    ...
END CATCH

-- Line 3 Make a single row return statement
SELECT @NewRowCount AS NewRowCount;

现在,您需要让执行SQL任务“听到”该行,因此将结果集类型从默认的None更改为SingleRow。在“结果集”选项卡中,单击“添加”按钮,结果集名称0将映射到User :: MyVariableCount或您调用的任何名称。

执行T-SQL语句任务与执行SQL任务

SSIS域中有两个类似命名的任务可供我们使用。数据库维护/其他任务下可用的远远,更常见的Execute SQL TaskExecute T-SQL Statement Task(取决于您的SSIS版本)。

执行SQL任务可以使用OLE,ODBC或ADO.NET连接管理器。 T-SQL任务仅支持ADO.NET连接管理器。

执行SQL任务能够接受参数并返回结果集,并使用SSIS变量或文件作为查询源。执行T-TSQ任务不接受任何参数,不提供输出,只能使用硬编码查询。

鉴于上述情况,我知道在任何情况下我都不会在执行SQL任务上使用执行T-SQL语句任务。交换现有任务以使用执行SQL任务,你会很高兴。否则,答案就是无法完成。

从执行SQL任务

获取结果集的演示

它对我有用,不知道在执行SQL任务返回单行结果集时遇到了什么错误。

enter image description here

为了简化这个过程,我跳过了上面SQL中最后一行的所有内容来进行查询SELECT 1 AS NewRowCount;

我创建了两个类型为Int32的两个SSIS变量User::RowCountNewADOUser::RowCountNewOLE

我的执行SQL任务配置如图所示

enter image description here

因此设置了结果集选项卡

enter image description here

亲自尝试

如果我没有演示Biml,那对我来说不是一个合适的SSIS答案。商业智能标记语言Biml允许我描述一个SSIS包,以便您可以在您的环境中重新创建它。您需要做的就是下载BIDS Helper这是Visual Studio的免费插件,可以帮助您完成SSIS / SSRS / SSAS开发体验。

安装完成后,右键单击您的SSIS项目并选择Add New Biml File。

将以下内容粘贴到BimlScript.biml文件

编辑第3行和第4行以指向有效的服务器(除非您在dev2014的本地计算机上运行命名实例)并保存。

右键单击BimlScript.biml并选择Generate SSIS Packages

<Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <Connections>
        <AdoNetConnection Name="CM_ADO_DB" ConnectionString="Data Source=localhost\dev2014;Integrated Security=SSPI;Connect Timeout=30;Database=msdb;" Provider="SQL"  />
        <OleDbConnection Name="CM_OLE" ConnectionString="Data Source=localhost\dev2014;Initial Catalog=tempdb;Provider=SQLNCLI11.0;Integrated Security=SSPI;"/>
    </Connections>    
    <Packages>
        <Package Name="so_34443637" ConstraintMode="Linear">
            <Variables>
                <Variable DataType="Int32" Name="RowCountNewADO">0</Variable>
                <Variable DataType="Int32" Name="RowCountNewOLE">0</Variable>
            </Variables>
            <Tasks>
                <ExecuteSQL 
                    ConnectionName="CM_ADO_DB" 
                    ResultSet="SingleRow"
                    Name="SQL - Get Row Count ADO">
                    <DirectInput>SELECT 1 AS NewRowCount;</DirectInput>
                    <Results>
                        <Result VariableName="User.RowCountNewADO" Name="0" />
                    </Results>
                </ExecuteSQL>
                <ExecuteSQL 
                    ConnectionName="CM_OLE" 
                    ResultSet="SingleRow"
                    Name="SQL - Get Row Count OLE">
                    <DirectInput>SELECT 1 AS NewRowCount;</DirectInput>
                    <Results>
                        <Result VariableName="User.RowCountNewOLE" Name="0" />
                    </Results>
                </ExecuteSQL>
                <ExecuteSQL ConnectionName="CM_OLE" Name="Breakpoint">
                    <DirectInput>SELECT 1 AS x;</DirectInput>
                </ExecuteSQL>
            </Tasks>
        </Package>
    </Packages>
</Biml>