【问题标题】:SSIS Select column name dynamically based on rows from another tableSSIS根据另一个表中的行动态选择列名
【发布时间】:2018-11-20 18:17:34
【问题描述】:

我想使用 SSIS 根据另一个表中的行动态选择列

示例:我有表 A,其中有我要查询的列的名称。所以我想查询表 B 中名称存储在表 A 中的列。

我在 SQL 查询中找到了一种方法,但我不知道如何在 SSIS 中这样做。

DECLARE @columnList VARCHAR(MAX),@sql VARCHAR(MAX)

SELECT @columnList = COALESCE(@columnList+',' ,'') + columnName
FROM [dbo].[tableA]


SET @sql = 'SELECT ' + @columnList + ' FROM dbo.TableB'

EXEC(@sql)

有什么建议吗?

谢谢

【问题讨论】:

  • 您的动态 SELECT 是否会产生相同数量的列且每列的数据类型相同?
  • 如果表 B 是一个 SQL 表,我会使用信息模式,因为你可以得到 DATA_TYPE 这很好
  • 不@SamKolli,列数是可变的,但它们都是相同的类型
  • 如果元数据在运行时发生变化,您将无法重用相同的数据流。如果您想坚持使用 SSIS,可以使用 BIML 或 SSIS 对象模型以编程方式生成包。如果是对象模型,请尝试 EzAPI 或我的库(例如:github.com/samskolli/Pegasus/blob/master/Pegasus.Demo/…;适当替换代码)。

标签: sql sql-server dynamic ssis


【解决方案1】:

使用执行 SQL 任务来查询表 A,并使用存储在表 A 中的列名使用 SQL 查询字符串填充字符串类型的包变量。您刚刚添加到问题中的代码可以,但不是执行 @sql 变量,而是将其返回到您的执行 SQL 任务并用它填充您的变量。

然后在您的数据流中,为您的源组件使用“从变量查询”选项并运行存储在您的字符串变量中的查询。

编辑:在进一步检查您的目标时,我不得不说不可能创建列可以更改的数据流。数据流的元数据是在创建包时创建的,不能在运行时更改。

【讨论】:

  • 我尝试了您的解决方案,但我的包变量中什么也没有。我不确定我的做法是否正确。这是我的 SQL 语句:DECLARE @columnList VARCHAR(MAX) SELECT @columnList = COALESCE(@columnList+',' ,'') + columnName FROM [dbo].[DimSecuredColumns] SET ? = 'SELECT DISTINCT ' + @columnList + ' FROM dbo.Fact' 我使用参数映射来映射?到我的包变量。 @Tab Alleman
  • 您可以在您的问题中使用脚本,只需将EXEC(@sql) 更改为SELECT @sql。指定您的 SQL 将返回一个标量值(单行),并将其映射到结果集中的变量。不需要参数。
  • 它不能完全工作。我必须使用对象类型的包变量才能在其中返回我的查询字符串,然后我使用脚本任务将对象类型转换为字符串类型,最后在我的源组件中使用字符串类型变量。但是有问题。源组件给出错误,因为在执行包之前此变量中没有值。如果我分配一个默认值,它会执行,但是当源输出列发生变化时我得到一个错误。所以我问自己我想要做的事情(动态列选择)是否可以通过 SSIS 实现。谢谢
  • 既然您提到它,不可能创建列可以更改的数据流。数据流的元数据是在创建包时创建的,不能在运行时更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多