【问题标题】:SQL Server SET FMTONLY is deprecated. How do you get the structure of multiple resultsets?SQL Server SET FMTONLY 已弃用。你如何获得多个结果集的结构?
【发布时间】:2014-08-19 02:09:26
【问题描述】:

我知道在 SQL Server 2012 SET FMTONLY 将被弃用之后。我开发了一个复杂的代码生成系统,它分析存储过程的结果并为存储库、数据契约和业务库生成 C# 代码。我正在使用 SET FMTONLY 来分析存储过程的结果集,以了解存储过程正在生成的数据合同。这个合约被生成到一个接口和它的实现中。我能够采用一个存储过程返回多个记录集并将数据作为数据合同返回给客户端。

我找不到 SET FMTONLY 的替代品来分析存储过程的所有结果集。是否有人对我如何检索存储过程的每个结果集的列、数据类型等有任何见解?

感谢您的帮助。

【问题讨论】:

    标签: sql-server tsql sql-server-2012 fmtonly


    【解决方案1】:

    SET FMTONLY ON 的缺陷在于它认为所有 SELECT 语句都是无条件的。替换 sp_describe_first_result_set 和 sp_describe_first_result_set_for_object 仅返回第一个结果集的元数据,因此在您的情况下不起作用。在元数据不兼容的多个结果的情况下,这些过程也会引发错误。

    我建议您通过对新建和部署的数据库实际执行 procs 来检索 C# 代码中的元数据,使用 SqlDataReader 方法检索元数据。此方法还可以很好地处理动态 SQL。这种方法存在问题的唯一情况是数据协定根据传递的值而变化,这无论如何都是设计问题。

    【讨论】:

    • 感谢您的反馈。存储过程中的每个结果集都与一个接口相关联,因此没有差异。使用 SET FMTONLY 的好处是您不必提供任何参数。您可以改为传递 null 。使用您的解决方案,您是否不必提供参数来运行存储的过程?
    • 是的,您需要传递所有强制参数。我只是在检索参数元数据后传递 NULL,就像使用 SET FMTONLY ON 一样(无论如何都需要接口合同)。
    • 优秀。谢谢你的指导
    • 我在想,是否可以通过在之后总是回滚的TRANSACTION 中调用过程来解决使用虚拟数据调用过程的危险?我忘记了——如果一个过程在父级TRANSACTION(即ROLLBACK)中执行COMMIT,会发生什么?
    猜你喜欢
    • 2018-01-06
    • 2017-12-15
    • 2010-09-26
    • 1970-01-01
    • 2013-12-13
    • 2018-08-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多