我正在尝试使用OLEDB目标中的“变量名称”选项选择目标表来使用动态列映射。我收到错误:“OLE DB Destination”验证失败并返回验证状态“VS_NEEDSNEWMETADATA”。
据我所知,我在SSIS中无法进行动态列验证。但是,为什么可以使用变量名在OLEDB中选择表目标?是不是动态列映射?
我要做的是创建一个foreach循环来读取表列表并将这些表从源数据库导入到暂存区域。使用OLEDB中的变量名称目标对我来说似乎很完美,但即使在数据流中启用DelayValidation也无法正常工作。
谢谢, 罗德里戈
答案 0 :(得分:1)
为什么我会使用Variable中的TableName作为我的OLE DB目标?
我自动完成了我的SSIS包开发。我没有指定每个表名,而是有一个名为FullyQualifiedName
的变量,我填充一次然后重复使用我的包。想想截断和重载模式:执行SQL任务以清除目标表,使用Foreach循环加载所有文件 - 因为名称是动态的,或者我有多天要加载的数据,然后归档文件。在这种情况下,我需要至少两次引用该表。通过将表名放在变量中,我可以定义一次并在许多不同的位置引用它。
我曾在我们基于客户物理隔离数据的环境中工作过。 即 Blackstone.Sales
,Yampas.Sales
,Ranger.Sales
等。当客户登录时,他们的帐户只能访问其架构中的数据。这些表的结构相同,但它们具有不同的名称以确保隔离。对于这样的场景,您可以将文件名与目标表进行匹配,因此希望使用变量来控制写入的表。
正如您已经确定的那样,您无法以您尝试的方式完成动态列映射。如果它是从源到临时环境的直接副本,我只是使用像Biml这样的技术来生成包并完成它。
答案 1 :(得分:0)
我已面对并处理过此类请求。不,SSIS不允许动态列映射。所以我尝试过以下几点:
您需要首先使用您对系统的了解并整理一种配置表,告诉您以下事项 -
-Source Table(SourceTable)
要从源表中提取的列(SourceQuery)
提示:SELECT
查询等。 SELECT ID, Name, Salary from dbo.tblEmployee
-Destination Table(DestinationTable)
- 需要从来源提供的栏目
- 其他细节如服务器名称/连接属性等。
您需要稍后使用ForEach
循环容器遍历此表的行。
接下来,在可能用于提取的源中,确定这些列中的最大列数和最大数据类型长度。您需要尽快创建一个包含信息的表格。
创建一种临时表,让我们说StgData
。我将使用50列创建此表,所有数据类型都为NVARCHAR(MAX)
。 CREATE
语句应如下所示:
CREATE TABLE StgData
(
Column1 NVARCHAR(MAX),
Column2 NVARCHAR(MAX),
Column3 NVARCHAR(MAX),
....
Column50 NVARCHAR(MAX)
)
原始数据将加载到StgData
。
ETLMappings
。
在此内容中,您必须使用INSERT
中的Execute SQL Task
语句来加载数据。任务中的脚本如下所示: -
INSERT INTO dbo.StgData
?
?
对应SourceQuery
列(应由ForEach
容器捕获。
加载StgData后,应该用它来加载DestinationTable
(也在ForEach
循环容器中捕获)
现在,您需要对架构和列映射有更好的理解。配置表应该有一个以
形式存储SQL查询的列INSERT INTO DestTable1 SELECT Col1, CAST(Col2 as float) Col2 FROM StgData
这些方面的东西。
这只是一个基本结构。当然,必须添加许多格式和自定义。