SSIS动态列验证

时间:2015-06-16 15:59:11

标签: sql-server ssis etl

我正在尝试使用OLEDB目标中的“变量名称”选项选择目标表来使用动态列映射。我收到错误:“OLE DB Destination”验证失败并返回验证状态“VS_NEEDSNEWMETADATA”。

据我所知,我在SSIS中无法进行动态列验证。但是,为什么可以使用变量名在OLEDB中选择表目标?是不是动态列映射?

我要做的是创建一个foreach循环来读取表列表并将这些表从源数据库导入到暂存区域。使用OLEDB中的变量名称目标对我来说似乎很完美,但即使在数据流中启用DelayValidation也无法正常工作。

谢谢, 罗德里戈

2 个答案:

答案 0 :(得分:1)

为什么我会使用Variable中的TableName作为我的OLE DB目标?

  1. 我自动完成了我的SSIS包开发。我没有指定每个表名,而是有一个名为FullyQualifiedName的变量,我填充一次然后重复使用我的包。想想截断和重载模式:执行SQL任务以清除目标表,使用Foreach循环加载所有文件 - 因为名称是动态的,或者我有多天要加载的数据,然后归档文件。在这种情况下,我需要至少两次引用该表。通过将表名放在变量中,我可以定义一次并在许多不同的位置引用它。

  2. 我曾在我们基于客户物理隔离数据的环境中工作过。 Blackstone.SalesYampas.SalesRanger.Sales等。当客户登录时,他们的帐户只能访问其架构中的数据。这些表的结构相同,但它们具有不同的名称以确保隔离。对于这样的场景,您可以将文件名与目标表进行匹配,因此希望使用变量来控制写入的表。

  3. 正如您已经确定的那样,您无法以您尝试的方式完成动态列映射。如果它是从源到临时环境的直接副本,我只是使用像Biml这样的技术来生成包并完成它。

答案 1 :(得分:0)

我已面对并处理过此类请求。不,SSIS不允许动态列映射。所以我尝试过以下几点:

  1. 您需要首先使用您对系统的了解并整理一种配置表,告诉您以下事项 -

    -Source Table(SourceTable)

    要从源表中提取的列(SourceQuery)

    提示SELECT查询等。 SELECT ID, Name, Salary from dbo.tblEmployee

    -Destination Table(DestinationTable)

    - 需要从来源提供的栏目

    - 其他细节如服务器名称/连接属性等。

  2. 您需要稍后使用ForEach循环容器遍历此表的行。

    1. 接下来,在可能用于提取的源中,确定这些列中的最大列数和最大数据类型长度。您需要尽快创建一个包含信息的表格。

    2. 创建一种临时表,让我们说StgData。我将使用50列创建此表,所有数据类型都为NVARCHAR(MAX)CREATE语句应如下所示:

      CREATE TABLE StgData
      (                            
      Column1 NVARCHAR(MAX),
      Column2 NVARCHAR(MAX),
      Column3 NVARCHAR(MAX),
      ....        
      Column50 NVARCHAR(MAX)
      ) 
      
    3. 原始数据将加载到StgData

      1. 现在有一个ForEach循环容器遍历ETLMappings。 在此内容中,您必须使用INSERT中的Execute SQL Task语句来加载数据。
      2. 任务中的脚本如下所示: -

        INSERT INTO dbo.StgData
        ?
        

        ?对应SourceQuery列(应由ForEach容器捕获。

        加载StgData后,应该用它来加载DestinationTable(也在ForEach循环容器中捕获)

        现在,您需要对架构和列映射有更好的理解。配置表应该有一个以

        形式存储SQL查询的列
        INSERT INTO DestTable1 SELECT Col1, CAST(Col2 as float) Col2 FROM StgData
        

        这些方面的东西。

        这只是一个基本结构。当然,必须添加许多格式和自定义。