当前位置: 首页 > 知识库问答 >
问题:

在SSIS2012中使用OLE DB源中的动态SQL

尚嘉庆
2023-03-14

我有一个作为SQL命令文本存储的过程,它将被传递一个包含表名的参数。然后该过程从该表返回数据。我不能直接调用表作为OLE DB源,因为过程中的结果集需要发生一些业务逻辑。在SQL2008中,这工作得很好。在一个升级的2012软件包中,我得到“元数据无法确定,因为...包含动态SQL。请考虑使用WITH RESULT SETS子句显式描述结果集。”

问题是我无法在过程中定义字段名,因为作为参数传递的表名可能是不同的值,并且每次得到的字段都可能不同。有人遇到这个问题或者有什么想法吗?我使用“dm_exec_descripe_first_result_set”、临时表和包含with结果集的CTE对动态SQL进行了各种尝试,但它在SSIS 2012中不起作用,同样的错误。上下文是许多动态SQL方法的一个问题。

DECLARE @sql VARCHAR(MAX)
SET @sql = 'SELECT * FROM ' + @dataTableName

DECLARE @listStr VARCHAR(MAX)
SELECT @listStr = COALESCE(@listStr +',','') + [name] + ' ' + system_type_name FROM sys.dm_exec_describe_first_result_set(@sql, NULL, 1)

exec('exec(''SELECT * FROM myDataTable'') WITH RESULT SETS ((' + @listStr + '))')

共有1个答案

酆华皓
2023-03-14

所以我出于好心问,为什么在上帝的绿色地球上,您使用SSIS数据流任务来处理这样的动态源数据?

您遇到麻烦的原因是您偏离了SSIS数据流任务的每一个目的:

  • 提取具有可在设计时静态类型化和缓存的已知元数据的已知源
  • 通过简单的(理想情况下是异步的)转换来运行已知的过程
  • 获取已转换数据并将其加载到具有已知元数据的已知目标

这导致了一个(可怕的,可怕的)解决方案--只需将所有数据加入一个包含Column1,Column2...ColumnN的临时表中,然后使用与表名参数相同的变量来有条件地分支代码,并对这些列执行任何您想要的操作。

另一个更明智的解决方案是为每个源表创建一个数据流任务,并在优先约束中使用参数来选择应该运行的数据流任务。

对于一个为开箱即用的ETL定制的解决方案,您还应该高度考虑只使用C#或脚本任务来滚动您自己的,而不是SSIS提供的数据流任务。

总之,请不要这样做。为孩子们(包裹)着想!

 类似资料:
  • 我的java代码: mymapper.xml:

  • 今天,我想讨论一个关于Flink的概念性话题,而不是一个技术性话题。 在我们的例子中,我们确实有两个Kafka主题A和B,需要连接。连接应该始终包括主题A中的所有元素,以及主题B中的所有新元素。实现这一点有两种可能:始终创建一个新的使用者并从一开始就开始使用主题A,或者在使用后将主题A中的所有元素保持在一个状态内。现在,技术方法是通过连接两个数据流,这很快就向我们展示了它在这个用例中的局限性,因为

  • 问题内容: 我必须遵循以下方案: python字典的python列表列表中的 每个元素都是一个python字典,看起来像这样: 现在,我希望所有字典作为主模板中的列表。但是,每个词典的内容应由子模板呈现。应使用哪种模板来呈现内容,应由字典的type变量定义。 关于使用Jinja2如何完成此操作的任何提示(如果有帮助,我正在通过Flask使用它。) 谢谢! 问题答案: 如果有人需要它: 然后可以在模

  • 正如标题所示,我对共享库如何与Rust中的线程局部变量一起工作感到困惑。下面我有一个最小的例子: 在名为的板条箱中: cargo.toml: src/lib.rs:

  • 问题内容: 我有以下表格示例。Thera可以是无限的分支机构和客户。我需要对该分支进行分组并计算他们的客户,然后用不同的列来显示它。 请注意,可以有无限的分支和客户,查询不仅必须在这种情况下有效。 在这种情况下,可接受的结果是: 示例SQL DATA 问题答案: 我认为写一个返回变量结构的流水线表函数虽然很复杂,但却是可能的。您的管道表函数将使用Oracle Data Cartridge接口和An

  • 问题内容: 为什么以下SQL不能给我任何东西 虽然 吸引我的行 问题答案: 您可以根据需要执行一些动态SQL,但我认为这并不是真正的竞争。