繁体   English   中英

使用Microsoft.SqlServer.Management.Smo从StoredProc获取结果列而不执行它

[英]Get result columns from a StoredProc without exec it, using Microsoft.SqlServer.Management.Smo

我想获得我可以从SP中获得的结果集和列的列表。 我已经能够获取参数,脚本...但是我不知道从何处获取结果集和列名称。

using Microsoft.SqlServer.Management.Smo;

using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["mydbconn"].ConnectionString))
        {
            conn.Open();
            Server sv = new Server(new Microsoft.SqlServer.Management.Common.ServerConnection(conn));
            Database db = sv.Databases["mydb"];

            foreach (StoredProcedure sp in db.StoredProcedures)
            {
                string[] columns = sp.??????
            }

        }

有没有办法进入专栏? 我最终试图写一个代码生成器来自动化我的写数据访问对象。 非常感谢!

编辑:“另一个解决方案是,如果您可以获取ScalarResult的值,则可以将其转换为有用的东西,您可以从中派生列。” :关于如何实现这一点的任何想法?

那是一个已知的困难领域。 某些系统通过在启用SET FMTONLY ON情况下执行存储过程来尝试此操作,但这存在一系列问题(即,它将仍然执行一些代码,这可能很糟糕)。 众所周知,要获得非平凡查询的模式也很困难(例如,不同的分支执行不同的选择)。

如果您知道该过程没有副作用,并且不要在分支中进行SELECT ,请尝试使用SET FMTONLY ON技巧-但至少要了解可能的影响。

对于查询,由于架构是形式化的,因此在某些方面表值函数(UDF)可能更实用。

在MSDN上浏览StoredProcedure成员页面( http://msdn.microsoft.com/zh-cn/library/microsoft.sqlserver.management.smo.storedprocedure_members.aspx )之后,我看到了两种可能的解决方案。

一,您可以使用GetTextBody获取存储过程的实际脚本。 之后,您可以以某种方式解析存储过程。 假设它们是由您或开发团队的成员(假设您有一个)创建并可以修改的,那么这会容易一些。 如果没有,那么它将变得非常混乱,非常快,而且不会100%...所以我不建议这样做。

另一种解决方案是,如果您可以得到ScalarResult的值,则可以将其转换为有用的内容,以派生列。

编辑:如果只想获取SP的参数,那将相对容易做到。 (根据上一个链接)有一个可以访问的名为Parameters的集合。

我知道马克很久以前就回答了这个问题。 但是随着Visual Studio 11的出现,SMO也有了长足发展。

现在,SMO中的每个StoredProcedure对象都有一个名为Parameters的列表。

从MSDN:

参数表示StoredProcedureParameterCollection对象的集合。 每个StoredProcedureParameter对象代表一个为存储过程定义的参数。

MSDN链接在这里

谢谢并恭祝安康

加根

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM