我有一个控制流,我用T-SQL命令创建一个临时数据库和表。当我添加数据流时,我想查询表格,但我不能,因为表格不存在以从中获取信息。当我尝试登录时出错,因为数据库尚不存在(尚未)。我有延迟验证为真。
如果我手动创建数据库和表,然后使用查询添加数据流并删除数据库,但它看起来不是一个干净的解决方案。
如果有更好的方法来创建临时登台数据库并在数据流中查询它,请告诉我。
答案 0 :(得分:1)
如果你绝对必须拥有一个数据库,该数据库只在你的软件包正在执行的短暂时刻内存在,那么这样做......你的第一个Control Flow项是一个创建数据库的Execute SQL语句。后跟另一个创建表的Execute SQL语句。接下来,将数据流放入表和查询中。最后,作为最后一个Control Flow项,使用DROP数据库命令执行SQL语句。完成,临时数据库。
对此的警告 - 正如您所注意到的 - 是为了设计数据流,数据库必须首先存在。没有办法解决这个问题。我们正在设计数据流的对象必须存在才能进行设计。但是,这个问题仅存在于设计阶段。这是暂时的。完成数据流设计后,您可以保存包并删除数据库。在您再次运行包之前,它会一直保持不变。设置"延迟验证"确保您的数据流不会尝试验证包顶部数据库的存在。在CREATE数据库语句之后,它将在需要之前等待juuust。所以你在那里很好。
但是,在实施此设计之前,我不得不问。为什么我们使用像变量一样的数据库?为什么创建它只是为了稍后DROP它?我想出一个问题,因为你希望在SQL中使用SQL语言来有选择地查询和/或操作它,我猜这样做是为了做到这一点。如果是这种情况,SSIS的重点是使用提供的数据流转换工具进行此类操作或查询。此外,您在问题中没有提到它,但您的数据的最终目的地是什么?我们不是只是将它加载到数据库中以使其丢弃。那它到底在哪里?平面文件?
答案 1 :(得分:1)
解决方案: 将Connection Manager上的属性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
Create a table named dbo.StateProvince that will be used as the destination table to populate the records from temporary table. Use the below create table script to create the destination 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
使用Business Intelligence Development Studio(BIDS)创建SSIS包。右键单击包底部的Connection Manager选项卡,然后单击New OLE DB Connection ...以创建新连接以访问SQL Server 2008 R2数据库。
单击“配置OLE DB连接管理器上的新建...”。
在“连接管理器”对话框中执行以下操作。
从提供商中选择本机OLE DB \ SQL Server Native Client 10.0 因为包将连接到SQL Server 2008 R2数据库
输入服务器名称,例如MACHINENAME \ INSTANCE
新创建的数据连接将显示在“配置OLE DB连接管理器”上。单击“确定”。
OLE DB连接管理器KIWI \ SQLSERVER2008R2.Sora将显示在程序包底部的“连接管理器”选项卡下。右键单击连接管理器,然后单击“属性”
将连接KIWI \ SQLSERVER2008R2.Sora上的属性RetainSameConnection设置为值True。
右键单击包内的任意位置,然后单击“变量”以查看变量窗格。创建以下变量。 包范围SO_5631010中名为PopulateTempTable的新变量,数据类型为String,并使用值EXEC dbo.PopulateTempTable设置变量。 包范围SO_5631010中名为FetchTempData的新变量,数据类型为String,并使用值SELECTCode,StateCode,Name FROM设置变量## tmpStateProvince
将“执行SQL任务”拖放到“控制流”选项卡上。双击“执行SQL任务”以查看“执行SQL任务编辑器”。 在“执行SQL任务编辑器”的“常规”页面上,执行以下操作。 将Name设置为Create并填充临时表 将连接类型设置为OLE DB 将连接设置为KIWI \ SQLSERVER2008R2.Sora 从SQLSourceType中选择Variable 从SourceVariable中选择User :: PopulateTempTable 单击“确定”
将数据流任务拖放到“控制流”选项卡上。将数据流任务重命名为将临时数据传输到数据库表。将执行SQL任务中的绿色箭头连接到数据流任务。
双击“数据流任务”以切换到“数据流”选项卡。将OLE DB源拖放到“数据流”选项卡上。双击“OLE DB源”以查看OLE DB源编辑器。 在OLE DB源编辑器的“连接管理器”页面上,执行以下操作。 从OLE DB连接管理器中选择KIWI \ SQLSERVER2008R2.Sora 从数据访问模式的变量中选择SQL命令 从变量名称中选择User :: FetchTempData 单击“列页”
单击“OLE DB源编辑器”上的“列”页面将显示以下错误,因为源命令变量中指定的表## tmpStateProvince不存在,并且SSIS无法读取列定义。
要修复错误,请在数据库Sora上使用SQL Server Management Studio(SSMS)执行语句EXEC dbo.PopulateTempTable,以便存储过程创建临时表。执行存储过程后,单击OLE DB源编辑器上的列页面,您将看到列信息。单击“确定”。
将OLE DB目标拖放到“数据流”选项卡上。将绿色箭头从OLE DB源连接到OLE DB目标。双击“OLE DB目标”以打开“OLE DB目标编辑器”。 在OLE DB目标编辑器的“连接管理器”页面上,执行以下操作。 从OLE DB连接管理器中选择KIWI \ SQLSERVER2008R2.Sora 选择表或视图 - 从数据访问模式快速加载 从表格或视图的名称中选择[dbo]。[StateProvince] 单击Mappings页面
如果输入和输出列名相同,OLE DB目标编辑器上的“单击映射”页面将自动映射列。单击确定。列StateProvinceID没有匹配的输入列,它在数据库中定义为IDENTITY列。因此,不需要映射。
配置完所有组件后,数据流选项卡应如下所示。
单击“数据流”选项卡上的“OLE DB源”,然后按F4查看“属性”。将属性ValidateExternalMetadata设置为False,以便SSIS在程序包执行的验证阶段不会尝试检查是否存在临时表。
从SQL Server Management Studio(SSMS)中的dbo.StateProvince执行查询select *,以查找表中的行数。在执行包之前它应该是空的。
执行包。控制流程显示成功执行。
在“数据流”选项卡中,您会注意到该包已成功处理6行。在此过程中创建的存储过程在临时表中插入了6行。
从SQL Server Management Studio(SSMS)中的dbo.StateProvince执行查询select *,以查找成功插入表中的6行。数据应与存储过程中的行匹配。
上面的示例说明了如何在包
中创建和使用临时表