在 SSIS 2012 的 OLE DB 源中使用动态 SQL

2023-11-24

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

问题是我无法在过程中定义字段名称,因为作为参数传递的表名称可能是不同的值,并且每次生成的字段都可能不同。有人遇到这个问题或者有什么想法吗?我已经使用“dm_exec_describe_first_result_set”、临时表和包含 RESULT SETS 的 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 + '))')

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

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

  • 提取具有已知元数据的已知源,这些元数据可以在设计时静态类型化和缓存
  • 通过直接(理想情况下是异步)转换来运行已知流程
  • 获取转换后的数据并将其加载到也具有已知元数据的已知目的地

拥有带回不同数据的参数化数据源是很好的。但坦率地说,让他们每次都带回完全不同的元数据,而不同集之间没有一致性,这是荒谬的,而且我不完全确定我想知道您如何处理 2008 年工作包中的所有列元数据。

这就是为什么它希望您向 SSIS 查询添加一个WITH RESULTS SET - 这样它就可以生成一些元数据。它不会在运行时执行此操作 - 它不能!它必须有一组已知的列(因为无论如何它都会将它们全部别名化为编译变量)才能使用。每次运行该数据流任务时,它都期望相同的列 - 完全相同的列,包括名称、类型和约束。

这导致了一个(可怕的、可怕的)解决方案 - 只需将所有数据粘贴到带有 Column1、Column2 ... ColumnN 的临时表中,然后使用与表名称参数相同的变量来有条件地分支代码并执行以下操作:无论你想要什么列。

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

对于这种针对开箱即用 ETL 量身定制的解决方案,您还应该高度考虑在 C# 或脚本任务中自行部署,而不是使用 SSIS 提供的数据流任务。

简而言之,请不要这样做。想想孩子们(包裹)!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 SSIS 2012 的 OLE DB 源中使用动态 SQL 的相关文章

  • 如何在“order by”中添加条件?

    我有一个带有输入参数的存储过程 现在根据这个参数 我的 order by 语句将发生变化 如果输入参数是 ID int类型列 则按ID排序 如果是 ProductType 则按产品类型排序 如果是 IssueDate 则应按问题日期排序 现
  • SQL Server - SQL 替换整个数据库中所有表中的所有列

    这是一个很遥远的事情 我猜这个问题没有简单的答案 但是 我继承了一个数据库 其中填充了一些可怕的数据 许多包含描述的行都有回车符 这意味着当我们 BCP 输出数据时 它会带有回车符 我的问题 有没有办法在 MS SQL Server 中对整
  • 在 Oracle 中使用数据透视表的建议

    我需要一份报告 我应该使用数据透视表 报告将按类别分组 使用 case when 语句不好 因为有很多类别 您可以将 Northwind 数据库视为示例 所有类别将显示为列和报告将显示客户在类别中的偏好 我不知道另一个解决方案 并在互联网上
  • 从一张表更新并插入另一张表

    我有两张桌子 table1 ID 代码 姓名 table2 ID 代码 姓名 具有相同的列 我想将数据从 table1 插入到 table2 或更新列 如果 table2 中存在 table1 ID table2 ID 执行此操作的简单方法
  • INNER/RIGHT/LEFT JOIN 怎么会比 FULL JOIN 慢 14 倍?

    我有一个查询 使用 FULL JOIN 需要 2 5 秒 使用 INNER RIGHT 或 LEFT JOIN 需要 40 秒 这是查询 子查询 完成两次 本身只需要 1 3 秒 SELECT T1 time T1 Total T1 rn
  • PostgreSQL WHERE 计数条件

    我在 PostgreSQL 中有以下查询 SELECT COUNT a log id AS overall count FROM Log as a License as b WHERE a license id 7 AND a licens
  • INTEGER 到 DATETIME 的转换与 VB6 不同

    我正在查看一些遗留的 VB6 代码 比我的时代早很多年 它对 SQL 2005 数据库运行查询 它提供了日期限制WHERE子句 其中日期作为整数值给出CLng VB6 中的日期 e g WHERE SomeDateField gt 4006
  • LEFT JOIN 比 INNER JOIN 快得多

    我有一张桌子 MainTable 有超过 600 000 条记录 它通过第二个表连接到自身 JoinTable 在父 子类型关系中 SELECT Child ID Parent ID FROM MainTable AS Child JOIN
  • Postgres 按查询分组

    我正在尝试在 postgres 的查询中使用 group by 我无法让它按照我想要的方式工作 以便根据需要对结果进行分组 这是另一个堆栈问题的扩展我刚刚回答过的递归查询 https stackoverflow com questions
  • 如何重置 SQL Server 中表的 IDENTITY 列? [复制]

    这个问题在这里已经有答案了 我怎样才能重置我的IDENTITY我已经填充的表中的列 我尝试过类似的方法 但它不起作用 WITH TBL AS SELECT ROW NUMBER OVER ORDER BY profile id AS RN
  • 获取 SQL 表上的某些百分位值

    假设我有一个表 其中存储用户 他们拥有的红球数量 球总数 蓝色 黄色 其他颜色等 以及红球与球总数的比率 架构如下所示 user id ratio red balls total balls 1 2 2 10 2 3 6 20 我想根据排序
  • T-SQL 平均值四舍五入到最接近的整数

    我不确定以前是否有人问过这个问题 但是如何在 T SQL 中将平均值四舍五入到最接近的整数 这应该可以做到 根据您要寻找的平均值 您可能需要在末尾使用 GROUP BY SELECT CONVERT int ROUND AVG Column
  • 如何选择从数据集中进入数据表的列?

    作为数据工作的新手 我希望我能正确地提出这个问题 如何选择从数据集中进入数据表的列 我知道我可以使用 填充数据表 DataTable table dataSet1 Tables 0 但这会引入所有列 如何仅使用某些列填充数据表 我正在使用
  • Java Hibernate 和 SQL Server 中 UUID 的不同表示

    我正在尝试绘制一个UUID使用 Hibernate 将 POJO 中的列转换为 SQL Server 表列 注释的应用如下 Id GeneratedValue Column name Id columnDefinition uniqueid
  • 使用 libpqxx 批量存储数据或如何在 libpqxx 中使用 COPY 语句

    要在 PostgreSQL 中插入批量数据 填充数据库 最快的方法是使用 COPY Source https stackoverflow com questions 758945 whats the fastest way to do a
  • SQL查询从表的每条记录生成多条记录

    我有一个包含 3000 条记录的表 使用其中的每一条记录 我必须生成大约 200 条记录 总共 600k 条记录 并通过 SQL Server 2012 将它们插入到第二个表中 我尝试使用 VBA 执行此操作 从第一个表中选择数据 计算 然
  • 从一条记录中获取多条记录

    我有一个包含 2 列的表 名称为字符串 数量为整数 例如我需要每条记录的数量 X 数量字段 Name Qty Dave 25 Nathan 10 Chaim 8 我需要 Dave 提供的来自 nathan 10 和 chaim 8 的 25
  • SQLAlchemy:检查给定值是否在列表中

    问题 在 PostgreSQL 中 检查某个字段是否在给定列表中是使用IN操作员 SELECT FROM stars WHERE star type IN Nova Planet SQLAlchemy 的等价物是什么INSQL查询 我尝试过
  • T-SQL参数嗅探重新编译计划

    我有 SQL 命令 exec sp executesql N SELECT TOP 10 FROM mytableView WHERE Name LIKE Value0 ORDER BY Id DESC N Value0 varchar 5
  • 如何在 ssis 包 2016 中捕获毫秒时间戳

    如何在 ssis 包 2016 中捕获当前时间戳 我声明了一个变量并使用表达式 但缺少毫秒 currenttimestamp DT WSTR 50 DT DBTIMESTAMP System StartTime 我也想要毫秒 Thanks

随机推荐