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

bep*_*bep 37 ssis

我有一个控制流程,我在其中使用T-SQL命令创建临时数据库和表.当我添加数据流时,我想查询表但我不能,因为该表不存在以从中获取信息.当我尝试登录时出错,因为数据库不存在(尚未).我有延迟验证为真.

如果我手动创建数据库和表,然后使用查询添加数据流并删除数据库,但它似乎不是一个干净的解决方案.

如果有更好的方法来创建临时登台数据库并在数据流中查询它,请告诉我.

小智 121

解:

RetainSameConnectionConnection Managerto 上设置属性,True以便在一个Control Flow任务中创建的临时表可以保留在另一个任务中.

下面是一个SSIS 2008 R2使用临时表编写的示例SSIS包.

演练:

创建一个存储过程,该过程将创建一个名为的临时表,##tmpStateProvince并填充少量记录.示例SSIS包将首先调用存储过程,然后获取临时表数据以将记录填充到另一个数据库表中.示例包将使用名为SoraUse the below create create procedure脚本的数据库.

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
Run Code Online (Sandbox Code Playgroud)

创建一个名为的表dbo.StateProvince,该表将用作目标表以填充临时表中的记录.使用以下create table脚本创建目标表.

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
Run Code Online (Sandbox Code Playgroud)

使用创建SSIS包Business Intelligence Development Studio (BIDS).右键单击程序包底部的" 连接管理器"选项卡,然后单击New OLE DB Connection...以创建新连接以访问SQL Server 2008 R2数据库.

连接管理器 - 新的OLE DB连接

单击New..." 配置OLE DB连接管理器".

配置OLE DB连接管理器 - 新增功能

在" 连接管理器"对话框中执行以下操作.

  • Native OLE DB\SQL Server Native Client 10.0提供程序中选择,因为程序包将连接到SQL Server 2008 R2数据库
  • 输入服务器名称,例如MACHINENAME\INSTANCE
  • 选择Use Windows Authentication登录到服务器部分或任何你喜欢.
  • 从中选择数据库Select or enter a database name,示例使用数据库名称Sora.
  • 点击 Test Connection
  • 单击OK" 测试连接成功"消息.
  • 单击OK" 连接管理器"

连接管理器

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

配置OLE DB连接管理器 - 已创建

OLE DB连接管理器KIWI\SQLSERVER2008R2.Sora将显示在程序包底部的" 连接管理器"选项卡下.右键单击连接管理器,然后单击Properties

连接管理器属性

RetainSameConnectionKIWI\SQLSERVER2008R2.Sora与值的连接上设置属性True.

Connection Manager上的RetainSameConnection属性

右键单击包内的任何位置,然后单击Variables以查看变量窗格.创建以下变量.

  • 包范围中名为PopulateTempTabledata type的新变量,并使用值设置变量.StringSO_5631010EXEC dbo.PopulateTempTable

  • 包范围中名为FetchTempDatadata type的新变量,并使用值设置变量StringSO_5631010SELECT CountryCode, StateCode, Name FROM ##tmpStateProvince

变量

将其拖放Execute SQL Task到" 控制流"选项卡上.双击"执行SQL任务"以查看" 执行SQL任务编辑器".

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

  • 名称设置为Create and populate temp table
  • 连接类型设置为OLE DB
  • 连接设置为KIWI\SQLSERVER2008R2.Sora
  • VariableSQLSourceType中选择
  • User::PopulateTempTableSourceVariable中选择
  • 点击 OK

执行SQL任务编辑器

将a拖放Data Flow Task到" 控制流"选项卡上.将数据流任务重命名为Transfer temp data to database table.将执行SQL任务中的绿色箭头连接到数据流任务.

控制流选项卡

双击Data Flow Task以切换到" 数据流"选项卡.将其拖放OLE DB Source到" 数据流"选项卡上.双击" OLE DB源"以查看OLE DB源编辑器.

OLE DB源编辑器Connection Manager页面上,执行以下操作.

  • KIWI\SQLSERVER2008R2.SoraOLE DB连接管理器中选择
  • SQL command from variable数据访问模式中选择
  • User::FetchTempData变量名称中选择
  • 点击Columns页面

OLE DB源编辑器 - 连接管理器

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

错误信息

要修复错误,请在数据库上EXEC dbo.PopulateTempTable使用SQL Server Management Studio(SSMS)执行语句, Sora以便存储过程创建临时表.执行存储过程后,单击OLE DB源编辑器Columns上的页面,您将看到列信息.点击.OK

OLE DB源编辑器 - 列

拖放OLE DB Destination到" 数据流"选项卡上.将绿色箭头从OLE DB源连接OLE DB目标.双击OLE DB Destination以打开OLE DB目标编辑器.

OLE DB目标编辑器Connection Manager页面上,执行以下操作.

  • KIWI\SQLSERVER2008R2.SoraOLE DB连接管理器中选择
  • Table or view - fast load数据访问模式中选择
  • [dbo].[StateProvince]从表格或视图的名称中选择
  • 点击Mappings页面

OLE DB目标编辑器 - 连接管理器

如果输入和输出列名称相同Mappings,OLE DB目标编辑器上的单击页面将自动映射列.点击OK.列StateProvinceID没有匹配的输入列,它被定义为IDENTITY数据库中的列.因此,不需要映射.

OLE DB目标编辑器 - 映射

配置完所有组件后," 数据流"选项卡应如下所示.

数据流选项卡

点击OLE DB Source上的数据流选项卡,然后按F4来查看Properties.将该属性设置ValidateExternalMetadata为False,以便SSIS在程序包执行的验证阶段不会尝试检查是否存在临时表.

设置ValidateExternalMetadata

select * from dbo.StateProvinceSQL Server Management Studio(SSMS)中执行查询以查找表中的行数.在执行包之前它应该是空的.

包执行前的表中的行

执行包.控制流程显示成功执行.

包执行 - 控制流选项卡

在"数据流"选项卡中,您将注意到包已成功处理6行.在此过程中创建的存储过程在临时表中插入了6行.

包执行 - 数据流选项卡

select * from dbo.StateProvinceSQL Server Management Studio(SSMS)中执行查询以查找成功插入表中的6行.数据应与存储过程中的行匹配.

包执行后表中的行

上面的示例说明了如何在包中创建和使用临时表.