如何在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数据库。

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

configurationOLE DB连接pipe理器上单击New...

配置OLE DB连接管理器 - 新建

在“ 连接pipe理器”对话框中执行以下操作。

  • 由于程序包将连接到SQL Server 2008 R2数据库,因此请select来自提供程序的Native OLE DB\SQL Server Native Client 10.0
  • input服务器名称 ,如MACHINENAME\INSTANCE
  • selectUse Windows Authenticationlogin到服务器部分或无论你喜欢什么。
  • Select or enter a database nameselect数据库Select or enter a database name ,该示例使用数据库名称Sora
  • 点击Test Connection
  • testing连接成功消息上单击OK
  • 连接pipe理器上单击OK

连接管理器

新创build的数据连接将显示在“ configurationOLE DB连接pipe理器”中 。 点击OK

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

OLE DB连接pipe理器KIWI\SQLSERVER2008R2.Sora将出现在软件包底部的“ 连接pipe理器”选项卡下。 用鼠标右键单击连接pipe理器,然后单击Properties

连接管理器属性

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

连接管理器上的RetainSameConnection属性

右键单击包内的任意位置,然后单击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中selectVariable
  • SourceVariable中selectUser::PopulateTempTable
  • 点击OK

执行SQL任务编辑器

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理器中selectKIWI\SQLSERVER2008R2.Sora
  • 数据访问模式的 SQL command from variableselectSQL command from variable
  • variables名称中selectUser::FetchTempData
  • 点击Columns页面

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

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

错误信息

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

OLE DB源编辑器 - 列

OLE DB Destination拖放到“ 数据stream”选项卡上。 将OLE DB Source的绿色箭头连接到OLE DB Destination 。 双击OLE DB Destination以打开OLE DB目标编辑器

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

  • OLE DB连接pipe理器中selectKIWI\SQLSERVER2008R2.Sora
  • selectTable or view - fast load数据访问模式 Table or view - fast load
  • 从表名或视图中select[dbo].[StateProvince]
  • 点击Mappings页面

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

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

OLE DB目标编辑器 - 映射

configuration完所有组件后,“ 数据stream”选项卡应该看起来像这样。

数据流选项卡

单击“ 数据stream”选项卡上的“ OLE DB Source ”,然后按F4查看“ Properties 。 将属性ValidateExternalMetadata设置为False,以便SSIS不会在包执行的validation阶段尝试检查是否存在临时表。

设置ValidateExternalMetadata

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”的原因与我的具体情况无关。 而且我不相信这个例子中发生的事情也是很重要的。