从存储过程返回多个表

Posted

技术标签:

【中文标题】从存储过程返回多个表【英文标题】:Returning multiple tables from a stored procedure 【发布时间】:2011-11-06 13:20:03 【问题描述】:

在我的 winform 应用程序中,我有以下场景:

我想在一个事件中获得多个表。在single server cycle, 中将所有表返回为dataset 或一次获取一张表并使用separate server cycle for each table 哪个更好?各有什么优势?

【问题讨论】:

一次性获取它们会减少请求的数量 - 但您需要更多的内存。仅在需要时获取它们可能会更好,如果有一些您不经常需要的表 - 仅在您真正需要它们时加载它们 为什么是-1??谁投了反对票? 这是一个根据应用​​程序大小、资源可用性和业务需求而变化的设计决策。这两种技术都是可能的。您可以根据业务环境选择其中一个。如果您想知道如何选择,您应该提供有关客户端环境、数据库负载、在线/离线状态、进行数据库调用的成本、根据需要获取数据的业务准备情况等更具体的信息。 【参考方案1】:

正常的方法是一次全部搞定。

只需构建您的SELECT,您将拥有一个包含所有表格的DataSet

using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(myConnString))

    using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand())
    
        cmd.CommandText = "myMultipleTablesSP";
        cmd.Connection = conn;
        cmd.CommandType = CommandType.StoredProcedure;

        conn.Open();

        System.Data.SqlClient.SqlDataAdapter adapter = new System.Data.SqlClient.SqlDataAdapter(cmd);

        DataSet ds = new DataSet();
        adapter.Fill(ds);

        conn.Close();
    

例如,如果您在 SP 中返回 2 个表,例如:

SELECT * FROM [TableA];
SELECT * FROM [TableB];

您可以通过以下方式访问这些表:

DataTable tableA = ds.Tables[0];
DataTable tableB = ds.Tables[1];

【讨论】:

这不是我需要的......我只是想知道哪个更好。 在 Windows 应用程序中,最好是我建议的示例。 DataSet 中返回的表是否总是与它们在 SP 中选择的顺序相同?【参考方案2】:

如果您单独加载每个表并使用线程,您可以大大提高性能。

数据集也很重...所以尽量避免使用它们。

【讨论】:

这是一个windows应用程序,你不需要避免DataSets,它们的存在是有原因的!在 Windows 应用程序中,您拥有 CPU 的所有功能,只为您的应用程序! 我同意 DataSet 可能非常繁重 - 但是管理多个线程以加载多个表(即,每个表一个线程)的开销可能会让人头疼,而且你也在做 x 到数据库服务器的连接,而不是一个。 @C0deNinja - 我不认为 balexandre 建议效率低下;在代码方面,效率和可维护性之间有一条细线。如果代码如此高效以至于不容易维护,那么它就不是真正的高效 (IMO)。 @tim 我同意...我只是在说明进行单独通话的一个优点。 你有链接 RE: 数据集性能而不是替代集合吗?我经常看到这种说法,但从未见过任何数字。

以上是关于从存储过程返回多个表的主要内容,如果未能解决你的问题,请参考以下文章

从返回多个结果集的存储过程中插入临时表

如何将单个结果集从返回多个集的 SQL 存储过程保存到临时表?

从返回多个实际表的复杂存储过程中检索 asp.net MVC 中的数据

如何从 Access 2010 中的 SQL 存储过程返回多个记录集

存储过程将多个表返回到spring jdbc模板

MYSQL的存储过程如何返回查询到的行数据?