Johnn5er Johnn5er - 3 months ago 18
SQL Question

Returning multiple values from sql stored procedure

I'm trying to return 4 variables from a stored procedure to a page in ASP.Net VB Script. It's only returning the first result then breaking. My knowledge of SQL is limited. I have tried the following:

SQL:

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

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

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

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


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

Answer

You have multiple selects which means multiple result-sets. So you have to move through them:

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")

Or, you can change the sproc to return one resultset with multiple columns:

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