我有一个控制流程,我在其中使用T-SQL命令创建临时数据库和表.当我添加数据流时,我想查询表但我不能,因为该表不存在以从中获取信息.当我尝试登录时出错,因为数据库不存在(尚未).我有延迟验证为真.
如果我手动创建数据库和表,然后使用查询添加数据流并删除数据库,但它似乎不是一个干净的解决方案.
如果有更好的方法来创建临时登台数据库并在数据流中查询它,请告诉我.
小智 121
RetainSameConnection
在Connection Manager
to 上设置属性,True
以便在一个Control Flow任务中创建的临时表可以保留在另一个任务中.
下面是一个SSIS 2008 R2
使用临时表编写的示例SSIS包.
创建一个存储过程,该过程将创建一个名为的临时表,##tmpStateProvince
并填充少量记录.示例SSIS包将首先调用存储过程,然后获取临时表数据以将记录填充到另一个数据库表中.示例包将使用名为Sora
Use 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数据库.
单击New...
" 配置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连接管理器KIWI\SQLSERVER2008R2.Sora
将显示在程序包底部的" 连接管理器"选项卡下.右键单击连接管理器,然后单击Properties
RetainSameConnection
在KIWI\SQLSERVER2008R2.Sora
与值的连接上设置属性True
.
右键单击包内的任何位置,然后单击Variables
以查看变量窗格.创建以下变量.
包范围中名为PopulateTempTable
data type的新变量,并使用值设置变量.String
SO_5631010
EXEC dbo.PopulateTempTable
包范围中名为FetchTempData
data type的新变量,并使用值设置变量String
SO_5631010
SELECT CountryCode, StateCode, Name FROM ##tmpStateProvince
将其拖放Execute SQL Task
到" 控制流"选项卡上.双击"执行SQL任务"以查看" 执行SQL任务编辑器".
在" 执行SQL任务编辑器"的General
页面上,执行以下操作.
Create and populate temp table
OLE DB
KIWI\SQLSERVER2008R2.Sora
Variable
从SQLSourceType中选择User::PopulateTempTable
从SourceVariable中选择OK
将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.Sora
从OLE DB连接管理器中选择SQL command from variable
从数据访问模式中选择User::FetchTempData
从变量名称中选择Columns
页面单击OLE DB源编辑器Columns
上的页面将显示以下错误,因为源命令变量中指定的表不存在,并且SSIS无法读取列定义.##tmpStateProvince
要修复错误,请在数据库上EXEC dbo.PopulateTempTable
使用SQL Server Management Studio(SSMS)执行语句, Sora
以便存储过程创建临时表.执行存储过程后,单击OLE DB源编辑器Columns
上的页面,您将看到列信息.点击.OK
拖放OLE DB Destination
到" 数据流"选项卡上.将绿色箭头从OLE DB源连接到OLE DB目标.双击OLE DB Destination
以打开OLE DB目标编辑器.
在OLE DB目标编辑器的Connection Manager
页面上,执行以下操作.
KIWI\SQLSERVER2008R2.Sora
从OLE DB连接管理器中选择Table or view - fast load
从数据访问模式中选择[dbo].[StateProvince]
从表格或视图的名称中选择Mappings
页面如果输入和输出列名称相同Mappings
,OLE DB目标编辑器上的单击页面将自动映射列.点击OK
.列StateProvinceID
没有匹配的输入列,它被定义为IDENTITY
数据库中的列.因此,不需要映射.
配置完所有组件后," 数据流"选项卡应如下所示.
点击OLE DB Source
上的数据流选项卡,然后按F4来查看Properties
.将该属性设置ValidateExternalMetadata
为False,以便SSIS在程序包执行的验证阶段不会尝试检查是否存在临时表.
select * from dbo.StateProvince
在SQL Server Management Studio(SSMS)中执行查询以查找表中的行数.在执行包之前它应该是空的.
执行包.控制流程显示成功执行.
在"数据流"选项卡中,您将注意到包已成功处理6行.在此过程中创建的存储过程在临时表中插入了6行.
select * from dbo.StateProvince
在SQL Server Management Studio(SSMS)中执行查询以查找成功插入表中的6行.数据应与存储过程中的行匹配.
上面的示例说明了如何在包中创建和使用临时表.
归档时间: |
|
查看次数: |
137556 次 |
最近记录: |