如何在SSIS控制流任务中创建临时表,然后在数据流任务中使用它?

如何在SSIS控制流任务中创建临时表,然后在数据流任务中使用它?,ssis,Ssis,我有一个控制流,在其中使用T-SQL命令在中创建临时数据库和表。当我添加一个数据流时,我想查询该表,但我不能,因为该表不存在,无法从中获取信息。当我尝试登录时,会出现错误,因为数据库还不存在。我认为这是真的 如果我手动创建数据库和表,然后添加带有查询的数据流,并删除数据库,但它看起来不是一个干净的解决方案 如果有更好的方法创建临时暂存数据库并在数据流中查询它,请告诉我。解决方案: 将连接管理器上的属性RetainSameConnection设置为True,以便在一个控制流任务中创建的临时表可以保

我有一个控制流,在其中使用T-SQL命令在中创建临时数据库和表。当我添加一个数据流时,我想查询该表,但我不能,因为该表不存在,无法从中获取信息。当我尝试登录时,会出现错误,因为数据库还不存在。我认为这是真的

如果我手动创建数据库和表,然后添加带有查询的数据流,并删除数据库,但它看起来不是一个干净的解决方案

如果有更好的方法创建临时暂存数据库并在数据流中查询它,请告诉我。

解决方案: 将
连接管理器
上的属性
RetainSameConnection
设置为
True
,以便在一个控制流任务中创建的临时表可以保留在另一个任务中

下面是一个用SSIS 2008 R2编写的SSIS包示例,演示了如何使用临时表

演练: 创建一个存储过程,该存储过程将创建一个名为
##tmpStateProvince
的临时表,并填充少量记录。示例SSIS包将首先调用存储过程,然后获取临时表数据以将记录填充到另一个数据库表中。示例包将使用名为
Sora的数据库
使用下面的创建存储过程脚本

USE Sora;
GO

CREATE PROCEDURE dbo.PopulateTempTable
AS
BEGIN
    
    SET NOCOUNT ON;

    IF OBJECT_ID('TempDB..##tmpStateProvince') IS NOT NULL
        DROP TABLE ##tmpStateProvince;

    CREATE TABLE ##tmpStateProvince
    (
            CountryCode     nvarchar(3)         NOT NULL
        ,   StateCode       nvarchar(3)         NOT NULL
        ,   Name            nvarchar(30)        NOT NULL
    );

    INSERT INTO ##tmpStateProvince 
        (CountryCode, StateCode, Name)
    VALUES
        ('CA', 'AB', 'Alberta'),
        ('US', 'CA', 'California'),
        ('DE', 'HH', 'Hamburg'),
        ('FR', '86', 'Vienne'),
        ('AU', 'SA', 'South Australia'),
        ('VI', 'VI', 'Virgin Islands');
END
GO
创建一个名为
dbo.StateProvince
的表,该表将用作目标表,以填充临时表中的记录。使用下面的创建表脚本创建目标表

USE Sora;
GO

CREATE TABLE dbo.StateProvince
(
        StateProvinceID int IDENTITY(1,1)   NOT NULL
    ,   CountryCode     nvarchar(3)         NOT NULL
    ,   StateCode       nvarchar(3)         NOT NULL
    ,   Name            nvarchar(30)        NOT NULL
    CONSTRAINT [PK_StateProvinceID] PRIMARY KEY CLUSTERED
        ([StateProvinceID] ASC)
) ON [PRIMARY];
GO
使用
Business Intelligence Development Studio(BIDS)
创建SSIS包。右键单击软件包底部的连接管理器选项卡,然后单击新建OLE DB连接…创建一个新连接以访问SQL Server 2008 R2数据库

单击“配置OLE DB连接管理器”上的“新建…”

在“连接管理器”对话框上执行以下操作

  • 从提供程序中选择
    Native OLE DB\SQL Server Native Client 10.0
    ,因为程序包将连接到SQL Server 2008 R2数据库
  • 输入服务器名称,如
    MACHINENAME\INSTANCE
  • 从“登录到服务器”部分或您喜欢的选项中选择“使用Windows身份验证”
  • 中选择数据库选择或输入数据库名称
    ,示例使用数据库名称
    Sora
  • 单击
    测试连接
  • 单击测试连接成功消息上的
    OK
  • 单击连接管理器上的
    OK

新创建的数据连接将显示在配置OLE DB连接管理器上。单击
OK

OLE DB连接管理器
KIWI\SQLSERVER2008R2。Sora
将显示在包底部的连接管理器选项卡下。右键单击连接管理器,然后单击属性

将连接
KIWI\SQLSERVER2008R2.Sora上的属性
RetainSameConnection
设置为值
True

右键单击程序包内的任意位置,然后单击变量
,以查看变量窗格。创建以下变量

  • 在包范围
    中添加数据类型
    String
    的名为
    PopulateTempTable
    的新变量,并使用值
    EXEC dbo.PopulateTempTable
    设置该变量

  • 在包范围
    SO_5631010
    中添加一个名为
    FetchTempData
    的新变量,该变量的数据类型为
    String
    ,并使用值
    设置该变量,从#tmpStateProvince

executesql任务
拖放到控制流选项卡上。双击执行SQL任务以查看执行SQL任务编辑器

在执行SQL任务编辑器的
General
页面上,执行以下操作

  • 将名称设置为“创建并填充临时表”
  • 将连接类型设置为
    OLE DB
  • 将连接设置为
    KIWI\SQLSERVER2008R2.Sora
  • 从SQLSourceType中选择
    Variable
  • 从SourceVariable中选择
    User::PopulateEmptable
  • 单击
    OK

数据流任务
拖放到“控制流”选项卡上。将数据流任务重命名为
Transfer temp Data to database table
。将绿色箭头从执行SQL任务连接到数据流任务

双击
数据流任务
切换到数据流选项卡。将
OLE DB源文件
拖放到“数据流”选项卡上。双击OLE DB源以查看OLE DB源编辑器

在OLE DB源代码编辑器的连接管理器页面上,执行以下操作

  • 从OLE DB连接管理器中选择
    KIWI\SQLSERVER2008R2.Sora
  • 从数据访问模式中选择变量中的SQL命令
  • 从变量名中选择
    User::FetchTempData
  • 单击
    页面

单击OLE DB源代码编辑器上的
Columns
页面将显示以下错误,因为源命令变量中指定的表
#tmpStateProvince
不存在,并且SSIS无法读取列定义

要修复此错误,请在数据库
Sora
上使用SQL Server Management Studio(SSMS)执行语句
EXEC dbo.populateEmptable
,以便存储的进程