【问题标题】:SSIS & SQL Server - Use SSIS Execute SQL Task to run a stored procedure in SQL Server then return the result set to SSIS object variableSSIS 和 SQL Server - 使用 SSIS 执行 SQL 任务在 SQL Server 中运行存储过程,然后将结果集返回到 SSIS 对象变量
【发布时间】:2020-07-18 19:59:38
【问题描述】:

我在 SQL Server 2012 中有以下存储过程:

USE [GESTAO_ATUARIAL]
GO
CREATE PROCEDURE [Atuaria].[CalcularFatorMensalizacaoTeste] @taxaJuros NUMERIC(7, 4) AS
    -- Variaveis
    DECLARE @woolhouse DECIMAL(16, 15) = 0.458333333333333;

    -- Fator de mensalização usa apenas tábua de mortalidade e taxa de juros
    ;WITH cte AS (
        -- Âncora
        SELECT
            Idade,
            CAST(Feminino AS NUMERIC(28, 25)) AS qxFeminino,
            CAST(1.0 AS NUMERIC(28, 25)) AS vx,
            CAST(1.0 AS NUMERIC(28, 25)) AS lxFeminino,
            CAST(Masculino AS NUMERIC(28, 25)) AS qxMasculino,
            CAST(1.0 AS NUMERIC(28, 25)) AS lxMasculino
        FROM Atuaria.RP2000SuavizadaMenos20 AS rp
        WHERE Idade = 0

        -- Parte recursiva
        UNION ALL

        SELECT
            cte.Idade + 1,
            CAST(Feminino AS NUMERIC(28, 25)),
            CAST((vx / (1 + @taxaJuros)) AS NUMERIC(28, 25)),
            CAST((lxFeminino * (1 - qxFeminino)) AS NUMERIC(28, 25)),
            CAST(Masculino AS NUMERIC(28, 25)),
            CAST((lxMasculino * (1 - qxMasculino)) AS NUMERIC(28, 25))
        FROM Atuaria.RP2000SuavizadaMenos20 AS rp
        JOIN cte
            ON cte.Idade + 1 = rp.Idade

        WHERE cte.Idade < 120
        
    ),
    -- Cálculo de Dx
    cte2 AS (
        SELECT
            cte.Idade,
            CAST(vx * lxFeminino AS NUMERIC(28, 25)) AS DxFeminino,
            CAST(vx * lxMasculino AS NUMERIC(28, 25)) AS DxMasculino
        FROM cte
    ) 
    -- Cálculo dos fatores de mensalização feminino e masculino
    SELECT
        Idade,
        CAST(1.0 AS NUMERIC(28, 25)) - @woolhouse / 
            (SUM(DxFeminino) OVER (ORDER BY Idade ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) / NULLIF(DxFeminino, 0)) AS FatorMensalizacaoFeminino,
        CAST(1.0 AS NUMERIC(28, 25)) - @woolhouse / 
            (SUM(DxMasculino) OVER (ORDER BY Idade ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) / NULLIF(DxMasculino, 0)) AS FatorMensalizacaoMasculino
    FROM cte2 OPTION (MAXRECURSION 0)

上述过程使用 CTE 生成一个包含 121 行和 3 列的表。它以利率为单一参数,使用死亡率表计算一些精算变量。

我使用 SSIS 来运行所有复杂的计算,它可以工作,但是我使用这个特定过程的方式在数据库中创建了很多表,我想简化一下。

我目前正在做的是复制 CTE 的代码来为每个福利计划(总共 11 个)创建一个程序。它是相同的代码,但在不同的存储过程中。

我没有将结果传递给 SSIS 对象变量,而是创建了一个表来存储每个福利计划的结果:

;WITH cte AS (

) SELECT * FROM cte INTO MyBenefitPlan1

因此,我有 11 个存储过程在做同样的事情,只是生成不同的表,因为每个计划都有不同的利率。

之后,我使用另一个执行 SQL 任务来检索 CTE 在存储过程中创建的表,然后将结果集传递给 SSIS 对象变量。

我需要知道的是如何从执行 SQL 任务中执行这个存储过程,并将其结果直接传递给 SSIS 对象变量。

我使用 ADO.NET 作为连接管理器。

【问题讨论】:

    标签: sql-server stored-procedures ssis ado.net


    【解决方案1】:
    1. 在 SSIS 变量窗口中创建所需的对象变量。
    2. 在执行 SQL 任务属性中,在执行 SQL 任务编辑器的“常规”选项卡中,将结果集属性更改为“完整结果集”。
    3. 将结果集映射到执行 SQL 任务编辑器的“结果集”选项卡中的变量。 “添加”一个映射,为结果集输入0,并在变量名称下拉列表中选择适当的对象变量。
    4. 如果您使用脚本任务来处理数据: 由于您使用的是 ADO.NET,结果集的类型将是 System.Data.DataSet。这与您从 OLEDB 获得的不同,因此您不需要 DataAdapter.Fill() 来自 SSIS 对象的数据表。而是获取 SSIS 变量的 .Value,将其直接转换为 DataSet,然后使用 .Tables 属性获取您的 DataTable

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 1970-01-01
      • 2010-10-29
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      • 2023-03-11
      相关资源
      最近更新 更多