当前位置:  开发笔记 > 后端 > 正文

从存储过程Transact-SQL SQL Server中访问结果集

如何解决《从存储过程Transact-SQLSQLServer中访问结果集》经验,为你挑选了3个好方法。

我正在使用SQL Server 2005,我想知道如何从transact-sql中访问不同的结果集.以下存储过程返回两个结果集,如何从例如另一个存储过程访问它们?

CREATE PROCEDURE getOrder (@orderId as numeric) AS
BEGIN   
    select order_address, order_number from order_table where order_id = @orderId
    select item, number_of_items, cost from order_line where order_id = @orderId
END

我需要能够单独遍历两个结果集.

编辑:只是澄清问题,我想测试存储过程.我有一组从VB.NET客户端使用的存储过程,它返回多个结果集.这些不会被改为表值函数,实际上我根本无法改变程序.更改程序不是一种选择.

过程返回的结果集与数据类型或列数不同.



1> Brannon..:

简短的回答是:你不能这样做.

从T-SQL无法访问嵌套存储过程调用的多个结果,而无需像其他人建议的那样更改存储过程.

要完成,如果过程返回单个结果,您可以使用以下语法将其插入临时表或表变量:

INSERT INTO #Table (...columns...)
EXEC MySproc ...parameters...

您可以对返回多个结果的过程使用相同的语法,但它只处理第一个结果,其余的将被丢弃.


我刚刚测试了Brannon的解决方案,事实上,如果被调用的存储过程中的所有查询都返回相同数量的列和数据类型,则返回的结果集将包含结果集的并集.这几乎没用.谢谢你的帮助.

2> 小智..:

通过创建包含内部数据集的SQL2005 CLR存储过程,我可以轻松地完成此操作.

你看,一个新的SqlDataAdapter将默认情况下将多结果集sproc填充到多表数据集中.这些表中的数据又可以插入到您希望编写的调用sproc中的#Temp表中. dataset.ReadXmlSchema将显示每个结果集的架构.

步骤1:开始编写将从多结果集sproc中读取数据的sproc

一个.根据模式为每个结果集创建单独的表.

CREATE PROCEDURE [dbo].[usp_SF_Read] AS
SET NOCOUNT ON;
CREATE TABLE #Table01 (Document_ID VARCHAR(100)
  , Document_status_definition_uid INT
  , Document_status_Code VARCHAR(100) 
  , Attachment_count INT
  , PRIMARY KEY (Document_ID));

湾 此时,您可能需要声明游标以重复调用您将在此处创建的CLR sproc:

第2步:制作CLR Sproc

Partial Public Class StoredProcedures
     _
    Public Shared Sub usp_SF_ReadSFIntoTables()

    End Sub
End Class

一个.连接使用New SqlConnection("context connection=true").

湾 设置命令对象(cmd)以包含多结果集sproc.

C.使用以下内容获取所有数据:

    Dim dataset As DataSet = New DataSet
    With New SqlDataAdapter(cmd)
        .Fill(dataset) ' get all the data.
    End With
'you can use dataset.ReadXmlSchema at this point...

d.遍历每个表并将每一行插入适当的临时表(您在上面的步骤1中创建).

最后说明: 根据我的经验,您可能希望强制执行表之间的某些关系,以便了解每条记录来自哪个批次.

这就是它的全部!

〜肖恩,在西雅图附近



3> 小智..:

还有一个你可以做的kludge.将可选参数N int添加到您的sproc中.将N的值默认为-1.如果N的值为-1,则执行每个选择.否则,执行第N次选择并仅选择第N次.

例如,

if (N = -1 or N = 0)
    select ...

if (N = -1 or N = 1)
    select ...

未指定N的sproc的调用者将获得具有多个表的结果集.如果你需要从另一个sproc中提取一个或多个这些表,只需调用你的sproc指定N的值.你必须为你想要提取的每个表调用一次sproc.如果您需要结果集中的多个表,那么效率很低,但它在纯TSQL中有效.

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有