从sql存储过程返回多个值

从sql存储过程返回多个值,sql,asp.net,vb.net,stored-procedures,Sql,Asp.net,Vb.net,Stored Procedures,我试图将4个变量从存储过程返回到ASP.NETVB脚本中的页面。它只是返回第一个结果,然后打破。我对SQL的知识有限。我尝试了以下方法: SQL: ASP.NET Function RequestsSent() Dim objCmd2 As sqlCommand Dim objRdr2 As sqlDataReader objCmd2 = New SqlCommand("spDashboardPaymentRequests", objConn) objCmd2.C

我试图将4个变量从存储过程返回到ASP.NETVB脚本中的页面。它只是返回第一个结果,然后打破。我对SQL的知识有限。我尝试了以下方法:

SQL:

ASP.NET

Function RequestsSent()
    Dim objCmd2 As sqlCommand
    Dim objRdr2 As sqlDataReader
    objCmd2 = New SqlCommand("spDashboardPaymentRequests", objConn)
    objCmd2.CommandType = CommandType.StoredProcedure
    objCmd2.Parameters.AddWithValue("@orgid", Session("orgid"))
    objConn.Open()
    objRdr2 = objCmd2.ExecuteReader
    objRdr2.Read()
    Session("RequestsSent") = objRdr2("requestsSent")
    Session("RequestsTotal") = objRdr2("requestTotal")
    Session("RequestsTotalPaid") = objRdr2("requestTotalPaid")
    Session("RequestsTotalUnpaid") = objRdr2("requestTotalUnpaid")
    objConn.Close()
End Function

我不知道asp,但您可能知道,因此这里有一个查询,可以将所有asp作为同一行,相应地调整您的asp代码:

SELECT COUNT(Receiptno) as requestsSent,
       (SELECT Sum(totamount) 
        FROM [demofee].[dbo].[vwallrequests]
        Where Orgid = @id) as requestTotal,
       --Query 3,
       --Query 4
FROM [demofeepay3].[dbo].[vwallrequests]
Where Orgid = @id

您有多个
select
s,这意味着有多个结果集。所以你必须通过它们:

objRdr2.Read()
Session("RequestsSent") = objRdr2("requestsSent")

objRdr2.NextResult()
objRdr2.Read()
Session("RequestsTotal") = objRdr2("requestTotal")

objRdr2.NextResult()
objRdr2.Read()
Session("RequestsTotalPaid") = objRdr2("requestTotalPaid")

objRdr2.NextResult()
objRdr2.Read()
Session("RequestsTotalUnpaid") = objRdr2("requestTotalUnpaid")
或者,您可以更改存储过程以返回一个包含多列的结果集:

Alter PROCEDURE  [dbo].[spDashboardPaymentRequests]
@id integer
AS
SELECT
    (SELECT COUNT(Receiptno) FROM [demofeepay3].[dbo].[vwallrequests] Where Orgid = @id) 
    as requestsSent,

    (SELECT Sum(totamount) FROM [demofee].[dbo].[vwallrequests] Where Orgid = @id) 
    as requestTotal,

    (SELECT Sum(totamount) FROM [demofee].[dbo].[vwallrequests] Where Orgid = @id AND status = 'paid')
    as requestTotalPaid,

    (SELECT Sum(totamount) FROM [demo].[dbo].[vwallrequests] Where Orgid = @id AND status = 'unpaid')
    as requestTotalUnpaid

干杯,伙计,我会试试这个,并让你知道:-)不是一个函数,而是一个方法,你不会返回任何东西。为您的方向声明一些输出参数并在SQL中设置它们。。。此外,sql可以简化为1条语句。
Alter PROCEDURE  [dbo].[spDashboardPaymentRequests]
@id integer
AS
SELECT
    (SELECT COUNT(Receiptno) FROM [demofeepay3].[dbo].[vwallrequests] Where Orgid = @id) 
    as requestsSent,

    (SELECT Sum(totamount) FROM [demofee].[dbo].[vwallrequests] Where Orgid = @id) 
    as requestTotal,

    (SELECT Sum(totamount) FROM [demofee].[dbo].[vwallrequests] Where Orgid = @id AND status = 'paid')
    as requestTotalPaid,

    (SELECT Sum(totamount) FROM [demo].[dbo].[vwallrequests] Where Orgid = @id AND status = 'unpaid')
    as requestTotalUnpaid