有没有办法确定SQL Server存储过程返回记录集

时间:2011-02-02 12:05:20

标签: sql sql-server oracle ddl

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

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

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

对于SQL Server,情况并非如此。目前,开发人员必须知道SQL Server SP是否返回记录集,并在界面上勾选一个选项。反过来,这会确定代码是否包含ExecuteQueryExecuteNonQuery

虽然这没关系,但是没有这个选项会很好。有没有办法可以通过检查数据字典或其他方式以编程方式确定?

谢谢,

詹姆斯

4 个答案:

答案 0 :(得分:3)

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

这对于存储过程来说很棘手,因为输出结果集的数量和结构可能会因输入参数值而异。如果您的程序代码非常重要,那么这很难解决 - 即使是严格的编码标准。

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

排序

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