如何在SSIS控制流任务中创建临时表,然后在数据流任务中使用它?
我有一个控制流,在其中使用T-SQL命令在中创建临时数据库和表。当我添加一个数据流时,我想查询该表,但我不能,因为该表不存在,无法从中获取信息。当我尝试登录时,会出现错误,因为数据库还不存在。我认为这是真的 如果我手动创建数据库和表,然后添加带有查询的数据流,并删除数据库,但它看起来不是一个干净的解决方案 如果有更好的方法创建临时暂存数据库并在数据流中查询它,请告诉我。解决方案: 将如何在SSIS控制流任务中创建临时表,然后在数据流任务中使用它?,ssis,Ssis,我有一个控制流,在其中使用T-SQL命令在中创建临时数据库和表。当我添加一个数据流时,我想查询该表,但我不能,因为该表不存在,无法从中获取信息。当我尝试登录时,会出现错误,因为数据库还不存在。我认为这是真的 如果我手动创建数据库和表,然后添加带有查询的数据流,并删除数据库,但它看起来不是一个干净的解决方案 如果有更好的方法创建临时暂存数据库并在数据流中查询它,请告诉我。解决方案: 将连接管理器上的属性RetainSameConnection设置为True,以便在一个控制流任务中创建的临时表可以保
连接管理器
上的属性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连接管理器”上的“新建…”
在“连接管理器”对话框上执行以下操作
- 从提供程序中选择
,因为程序包将连接到SQL Server 2008 R2数据库Native OLE DB\SQL Server Native Client 10.0
- 输入服务器名称,如
MACHINENAME\INSTANCE
- 从“登录到服务器”部分或您喜欢的选项中选择“使用Windows身份验证”
- 从
,示例使用数据库名称中选择数据库选择或输入数据库名称
Sora
- 单击
测试连接
- 单击测试连接成功消息上的
OK
- 单击连接管理器上的
OK
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
- 单击
页面列
Columns
页面将显示以下错误,因为源命令变量中指定的表#tmpStateProvince
不存在,并且SSIS无法读取列定义
要修复此错误,请在数据库Sora
上使用SQL Server Management Studio(SSMS)执行语句EXEC dbo.populateEmptable
,以便存储的进程