在 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 的相关文章

  • 创建表作为 select 删除 postgresql 中的非空约束

    在 postgres sql 中 创建表时 select 删除了表上的非空约束 例如 对此没有单一命令的解决方案 要基于现有表 包括所有约束 创建表 请使用 create table B like a including constrain
  • 使用 Switch 的报告服务表达式

    我无法让这个表达式与报告服务一起使用 我必须使用 IF 和 ELSE IF 语句 感谢您的任何建议 Switch IsNothing Fields field date Value Fields set flag Value 1 Decli
  • 如何授予所有表的 REFERENCES 权限

    我必须授予REFERENCES登录权限说sql login 我可以给予资助REFERENCES对单个表的权限 例如 GRANT REFERENCES ON Mytable TO sql login 有什么办法可以授予REFERENCES允许
  • Oracle 中的 SQL 调优 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何文章 链接可以让我找到 SQL 调优 Oracle 的示例 如果能用例子来解释那就太好了 我需
  • 如何在 sqlalchemy 中创建基于文字的查询?

    我创建了一个函数来创建表达式 def test operator1 operation operator2 return literal column operator1 op operation operator2 现在当我用 test
  • SQL参数化查询不显示结果

    我的 DataAcess 类中有以下函数 但它没有显示任何结果 我的代码如下 public List
  • 连接两个表的查询的 SQL Server“FOR XML”输出

    我是 SQL Server 中 FOR XML 功能的新手 我正在使用 SQL Server 2012 我有两个表 Word 和 Word Expansion 样本数据 表 字 WordOID Word 1 PIPE 2 WIRE 表 Wo
  • 如何在Oracle中使用Timestamp_to_scn和Scn_to_timestamp?

    我的查询结果是这样的 select cast to date a start time mm dd yyyy hh mi ss pm as timestamp date of call ora rowscn from calling tab
  • SQL Server 用分隔符分割字符串

    我有一个输入字符串 100 2 3 101 2 1 103 2 3 我想解析它并将其添加到具有 3 列的表中 因此它应该是 f x col1 col2 col3 100 2 3 类似的其他数据以逗号分隔作为记录和 作为列 Thanks ni
  • 查找 PostgreSQL 中所有范围集合的所有交集

    我正在寻找一种有效的方法来查找时间戳范围集之间的所有交集 它需要与 PostgreSQL 9 2 配合使用 假设这些范围代表一个人可以见面的时间 每个人都可以有一个或多个空闲时间范围 我想找到all可以召开会议的时间段 即所有人都有空的时间
  • 为什么这会返回资源 id #2? [复制]

    这个问题在这里已经有答案了 可能的重复 我如何从 PHP 中的 MySql 响应中 回显 资源 id 6 https stackoverflow com questions 4290108 how do i echo a resource
  • 将 UUID 存储为 base64 字符串

    我一直在尝试使用 UUID 作为数据库键 我希望占用尽可能少的字节数 同时仍然保持 UUID 表示形式的可读性 我认为我已经使用 base64 将其减少到 22 个字节 并删除了一些尾随的 这些 对于我的目的来说似乎没有必要存储 这种方法有
  • 分层查询

    我希望我能够解释困扰我的问题 我有以下分层数据集 这只是 34K 记录的子集 PARENT ID CHILD ID EXAM TUDA12802 TUDA12982 N TUDA12982 TUDA12984 J TUDA12984 TUD
  • 插入触发器最终在分区表中插入重复行

    我有一个分区表 我认为 适当的INSERT触发器和一些限制 不知何故 INSERT语句为每个语句插入 2 行INSERT 一个用于父分区 一个用于相应的分区 设置简要如下 CREATE TABLE foo id SERIAL NOT NUL
  • 存储过程和权限 - EXECUTE 就足够了吗?

    我有一个 SQL Server 2008 数据库 其中对基础表的所有访问都是通过存储过程完成的 一些存储过程只是从表中选择记录 而其他存储过程则进行 UPDATE INSERT 和 DELETE 如果存储过程更新表 执行存储过程的用户是否也
  • 在sqlite SQL语句中与order by子句结合使用limit

    下面的两条 SQL 语句总是会产生相同的结果集吗 1 SELECT FROM MyTable where Status 0 order by StartTime asc limit 10 2 SELECT FROM SELECT FROM
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • sql server 按组排名

    问题看似简单 但我却无法理解 这是针对 sql 服务器的 what I have in a table What I need as a output cksum id cksum id 2162514679 204 2162514679
  • 在 Sql Server 中转换为日期时间 MM/dd/yyyy HH:mm:ss

    如何将给定的日期格式转换为MM dd yyyy HH mm ss 我尝试了下面这个但没有实现 谁能帮我 SELECT CONVERT VARCHAR 20 GETDATE 120 SQL Server 2005及以上版本支持 SELECT
  • Spark.read 在 Databricks 中给出 KrbException

    我正在尝试从 databricks 笔记本连接到 SQL 数据库 以下是我的代码 jdbcDF spark read format com microsoft sqlserver jdbc spark option url jdbc sql

随机推荐