【问题标题】:Is there any way of determining of a SQL Server Stored Procedure returns a recordset是否有任何方法可以确定 SQL Server 存储过程返回记录集
【发布时间】:2011-02-02 12:05:19
【问题描述】:

我们有一个内部应用程序,它生成 ASP 代码来调用 Oracle 和 SQL 存储过程。

此应用程序查询相应的数据字典,并能够确定参数信息,并相应地构造调用。使用此应用程序的开发人员可以将代码包含在他们的项目中,并使用专用 DTO(也由应用程序生成)将数据传递给它。

在 Oracle 中,我们可以很高兴地确定是否返回了记录集,因为我们使用了 refcursors,并且它们显示在 Oracle DDL 的参数列表中。

对于 SQL Server,情况并非如此。目前开发者自己要知道SQL Server SP是否返回一个记录集,并在界面上勾选一个选项。这反过来又决定了生成的代码是否包含ExecuteQueryExecuteNonQuery

虽然这没关系,但最好不要有这个选项。有没有一种方法可以通过检查数据字典或其他方式以编程方式确定他?

谢谢,

詹姆斯

【问题讨论】:

    标签: sql sql-server oracle ddl


    【解决方案1】:

    您可以使用SET FMTONLY [ON|OFF] 检查由 SQL 语句生成的结果集格式。 Reporting Services 等 MS 工具使用此技术来确定输出结果集的结构。

    这对于存储过程来说很棘手,因为输出结果集的数量和结构可能会因输入参数值而异。如果您的程序代码不平凡,即使采用严格的编码标准,这也很难解决。

    我见过其他方法(例如使用扩展参数),但没有一种方法是绝对可靠的。让开发人员打勾可能是最好的解决方案。

    【讨论】:

    • 这可能就足够了。我对数字或结构不感兴趣,只是它有或没有。如果答案是“视情况而定”,那么在某些情况下它很可能会失败。
    【解决方案2】:

    不,因为您可以编写一个有时仅返回结果集的过程,具体取决于您选择的任何逻辑或参数。它很可能很难维护,但没有什么能阻止你这样做。

    因此,在一般情况下,您永远无法知道此过程的执行是否会返回结果集,这意味着系统无法存储任何有用的元数据。 p>

    【讨论】:

      【解决方案3】:

      这也可能有帮助:metadata from stored procedures

      【讨论】:

        【解决方案4】:

        尝试以下变化:- 选择 o.name、p.name、t.name、p.max_length、p.is_output 来自 sys.parameters p 内连接 sys.objects o on o.object_id = p.object_id t.user_type_id = p.user_type_id 上的内部连接 ​​sys.types t 按 o.name 排序;

        (您可以将其创建为视图)。

        【讨论】:

        • 此代码显示存储过程和函数的输入/输出参数,而不是返回一个或多个结果集。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-06
        • 1970-01-01
        • 1970-01-01
        • 2012-10-11
        • 1970-01-01
        • 2011-01-03
        • 1970-01-01
        相关资源
        最近更新 更多