如何在SSIS控制stream任务中创build临时表,然后将其用于数据stream任务?
我有一个控制stream,我用T-SQL命令创build临时数据库和表。 当我添加一个数据stream,我想查询表,但我不能因为表不存在,以获取信息。 当我尝试我得到login错误,因为数据库不存在(还)。 我有延迟validation为真。
如果我手动创build数据库和表,然后添加查询数据stream,并放下它坚持的数据库,但它似乎不是一个干净的解决scheme。
如果有更好的方法来创build临时登台数据库并在数据stream中查询,请告诉我。
解:
将Connection Manager
上的属性RetainSameConnection
设置为True
以便在一个控制stream任务中创build的临时表可以保留在另一个任务中。
这里是一个在SSIS 2008 R2
中编写的示例SSIS包,用于演示如何使用临时表。
演练:
创build一个存储过程,将创build一个名为##tmpStateProvince
的临时表,并填充less量logging。 示例SSIS包将首先调用存储过程,然后将获取临时表数据将logging填充到另一个数据库表中。 示例包将使用名为Sora
的数据库使用下面的创build存储过程脚本。
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
创build一个名为dbo.StateProvince
的表,将用作目标表来填充临时表中的logging。 使用下面的创build表脚本来创build目标表。
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)
创build一个SSIS包。 右键单击程序包底部的“ 连接pipe理器”选项卡,然后单击“ New OLE DB Connection...
以创build一个新连接来访问SQL Server 2008 R2数据库。
在configurationOLE DB连接pipe理器上单击New...
在“ 连接pipe理器”对话框中执行以下操作。
- 由于程序包将连接到SQL Server 2008 R2数据库,因此请select来自提供程序的本
Native OLE DB\SQL Server Native Client 10.0
- input服务器名称 ,如
MACHINENAME\INSTANCE
- select
Use Windows Authentication
从login到服务器部分或无论你喜欢什么。 - 从
Select or enter a database name
select数据库Select or enter a database name
,该示例使用数据库名称Sora
。 - 点击
Test Connection
- 在testing连接成功消息上单击
OK
。 - 在连接pipe理器上单击
OK
新创build的数据连接将显示在“ configurationOLE DB连接pipe理器”中 。 点击OK
。
OLE DB连接pipe理器KIWI\SQLSERVER2008R2.Sora
将出现在软件包底部的“ 连接pipe理器”选项卡下。 用鼠标右键单击连接pipe理器,然后单击Properties
将连接KIWI\SQLSERVER2008R2.Sora
上的属性RetainSameConnection
设置为值True
。
右键单击包内的任意位置,然后单击Variables
以查看variables窗格。 创build以下variables。
-
在包范围
SO_5631010
创build一个名为PopulateTempTable
的数据types为String
的新variables,并将值设置为EXEC dbo.PopulateTempTable
。 -
一个名为
FetchTempData
的数据types为String
新variables,位于程序包范围SO_5631010
,并将该variables的值设置为SELECT CountryCode, StateCode, Name FROM ##tmpStateProvince
将“ Execute SQL Task
拖放到“ 控制stream”选项卡上。 双击“执行SQL任务”查看“ 执行SQL任务编辑器” 。
在“ 执行SQL任务编辑器”的“ General
页面上,执行以下操作。
- 将名称设置为“
Create and populate temp table
- 将连接types设置为
OLE DB
- 将连接设置为
KIWI\SQLSERVER2008R2.Sora
- 从SQLSourceType中select
Variable
- 从SourceVariable中select
User::PopulateTempTable
- 点击
OK
将Data Flow Task
拖放到“ 控制stream”选项卡上。 将数据stream任务重命名为Transfer temp data to database table
。 将执行SQL任务的绿色箭头连接到数据stream任务 。
双击Data Flow Task
切换到数据stream选项卡。 将一个OLE DB Source
拖放到数据stream选项卡上。 双击OLE DB源查看OLE DB源编辑器 。
在OLE DB源编辑器的Connection Manager
页上执行以下操作。
- 从OLE DB连接pipe理器中select
KIWI\SQLSERVER2008R2.Sora
- 从数据访问模式的
SQL command from variable
selectSQL command from variable
- 从variables名称中select
User::FetchTempData
- 点击
Columns
页面
单击OLE DB源编辑器上的Columns
页面将显示以下错误,因为源命令variables中指定的表##tmpStateProvince
不存在,并且SSIS无法读取列定义。
要修复错误,请在数据库Sora
上使用SQL Server Management Studio(SSMS)执行语句EXEC dbo.PopulateTempTable
以便存储过程将创build临时表。 执行存储过程后,单击OLE DB Source Editor上的Columns
页面,您将看到列信息。 点击OK
。
将OLE DB Destination
拖放到“ 数据stream”选项卡上。 将OLE DB Source的绿色箭头连接到OLE DB Destination 。 双击OLE DB Destination
以打开OLE DB目标编辑器 。
在OLE DB目标编辑器的Connection Manager
页上执行以下操作。
- 从OLE DB连接pipe理器中select
KIWI\SQLSERVER2008R2.Sora
- select
Table or view - fast load
从数据访问模式Table or view - fast load
- 从表名或视图中select
[dbo].[StateProvince]
- 点击
Mappings
页面
如果input和输出列名相同,则单击OLE DB目标编辑器上的Mappings
页面将自动映射列。 点击OK
。 列StateProvinceID
没有匹配的input列,它被定义为数据库中的IDENTITY
列。 因此,不需要映射。
configuration完所有组件后,“ 数据stream”选项卡应该看起来像这样。
单击“ 数据stream”选项卡上的“ OLE DB Source
”,然后按F4查看“ Properties
。 将属性ValidateExternalMetadata
设置为False,以便SSIS不会在包执行的validation阶段尝试检查是否存在临时表。
在SQL Server Management Studio(SSMS)中执行select * from dbo.StateProvince
来查找表中的行数。 执行包之前应该是空的。
执行包。 控制stream程显示成功执行。
在“数据stream”选项卡中,您会注意到该包成功处理了6行。 在此之前创build的存储过程将6行插入到临时表中。
在SQL Server Management Studio(SSMS)中执行select * from dbo.StateProvince
来查找成功插入到表中的6行。 数据应该与存储过程中find的行匹配。
上面的例子说明了如何在包中创build和使用临时表。
我迟到了这个派对,但是我想给user756519补充一点。 根据我最近的经验,我不相信“连接pipe理器上的RetainSameConnection”属性在这个实例中是相关的。 就我而言,相关的一点是他们build议将“ValidateExternalMetadata”设置为False。
我正在使用临时表来方便将数据从一个数据库(和服务器)复制到另一个数据库,因此“RetainSameConnection”的原因与我的具体情况无关。 而且我不相信这个例子中发生的事情也是很重要的。