一个存储过程中的多个单独的SQL查询

mlg*_*g74 4 t-sql sql-server sql-server-2008

我需要许多(16)个不同的查询来同时获取行数.我正在运行16个不同的连接,但我认为我可以合并到只有1个存储过程.

我遇到了麻烦,因为它为此行的datareader(系统超出范围检测)提供了错误:

Count2 = Convert.ToInt32(objDRL("Row_Count2").ToString). 
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

Dim strConn As String = "Data Source=myDataSource"
    Dim Conn As New SqlConnection(strConn)
    Dim Cmd As New SqlCommand("adminStats", Conn)
    Cmd.CommandType = CommandType.StoredProcedure
    Dim objDRL As SqlDataReader
    Cmd.Parameters.Add(New SqlParameter("@campDate", "June 2014"))
    Conn.Open()
    objDRL = Cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection)
    If objDRL.HasRows Then
        While objDRL.Read()
            Count1 = Convert.ToInt32(objDRL("Row_Count1"))
            Count2 = Convert.ToInt32(objDRL("Row_Count2"))
            Count3 = Convert.ToInt32(objDRL("Row_Count3"))
            Count4 = Convert.ToInt32(objDRL("Row_Count4"))
            Count5 = Convert.ToInt32(objDRL("Row_Count5"))
            Count6 = Convert.ToInt32(objDRL("Row_Count6"))
            Count7 = Convert.ToInt32(objDRL("Row_Count7"))
            Count8 = Convert.ToInt32(objDRL("Row_Count8"))
            Count9 = Convert.ToInt32(objDRL("Row_Count9"))
            Count10 = Convert.ToInt32(objDRL("Row_Count10"))
            Count11 = Convert.ToInt32(objDRL("Row_Count11"))
            Count12 = Convert.ToInt32(objDRL("Row_Count12"))
            Count13 = Convert.ToInt32(objDRL("Row_Count13"))
            Count14 = Convert.ToInt32(objDRL("Row_Count14"))
            Count15 = Convert.ToInt32(objDRL("Row_Count15"))


        End While
    Else

    End If

    link1.Text = Count1.ToString
    link2.Text = Count2.ToString
    link3.Text = Count3.ToString
    link4.Text = Count4.ToString
    Link5.Text = Count5.ToString
    Link6.Text = Count6.ToString
    Link7.Text = Count7.ToString
    Link8.Text = Count8.ToString
    Link9.Text = Count9.ToString
    Link10.Text = Count10.ToString
    Link11.Text = Count11.ToString
    Link12.Text = Count12.ToString
    Link13.Text = Count13.ToString
    Link14.Text = Count14.ToString
    Link15.Text = Count15.ToString

    Conn.Close()
Run Code Online (Sandbox Code Playgroud)

存储过程:

CREATE PROCEDURE adminStats 
    @campDate VARCHAR(20)
AS
BEGIN
    SELECT COUNT(*) AS Row_Count1 FROM Customer
    SELECT COUNT(*) AS Row_Count2 FROM campRegistration WHERE campDate = @campDate
    SELECT COUNT(*) AS Row_Count3 FROM campRegistration WHERE paidFull = 'True'

    SELECT COUNT(*) AS Row_Count4 FROM campRegistration WHERE shirtSize = 'S'
    SELECT COUNT(*) AS Row_Count5 FROM campRegistration WHERE shirtSize = 'M'
    SELECT COUNT(*) AS Row_Count6 FROM campRegistration WHERE shirtSize = 'L'
    SELECT COUNT(*) AS Row_Count7 FROM campRegistration WHERE shirtSize = 'XL'
    SELECT COUNT(*) AS Row_Count8 FROM campRegistration WHERE shirtSize = 'XXL'

    SELECT COUNT(*) AS Row_Count9 FROM campRegistration WHERE Staff = 'True'

    SELECT COUNT(*) AS Row_Count10 FROM campRegistration WHERE days = '1'
    SELECT COUNT(*) AS Row_Count11 FROM campRegistration WHERE days = '2'
    SELECT COUNT(*) AS Row_Count12 FROM campRegistration WHERE days = '3'
    SELECT COUNT(*) AS Row_Count13 FROM campRegistration WHERE days = '12'
    SELECT COUNT(*) AS Row_Count14 FROM campRegistration WHERE days = '23'
    SELECT COUNT(*) AS Row_Count15 FROM campRegistration WHERE days = '123'
END
GO
Run Code Online (Sandbox Code Playgroud)

Dev*_*art 9

尝试更改您的查询 -

CREATE PROCEDURE adminStats 
    @campDate varChar(20)
AS
BEGIN

    SELECT 
         (SELECT COUNT(1) FROM dbo.Customer) AS Row_Count1
        , COUNT(CASE WHEN campDate = @campDate THEN 1 END) AS Row_Count2
        , COUNT(CASE WHEN paidFull = 'True' THEN 1 END) AS Row_Count3
        , COUNT(CASE WHEN shirtSize = 'S' THEN 1 END) AS Row_Count4  
        , COUNT(CASE WHEN shirtSize = 'M' THEN 1 END) AS Row_Count5  
        , COUNT(CASE WHEN shirtSize = 'L' THEN 1 END) AS Row_Count6  
        , COUNT(CASE WHEN shirtSize = 'XL' THEN 1 END) AS Row_Count7  
        , COUNT(CASE WHEN shirtSize = 'XXL' THEN 1 END) AS Row_Count8  
        , COUNT(CASE WHEN Staff = 'True' THEN 1 END) AS Row_Count9
        , COUNT(CASE WHEN [days] = '1' THEN 1 END) AS Row_Count10 
        , COUNT(CASE WHEN [days] = '2' THEN 1 END) AS Row_Count11
        , COUNT(CASE WHEN [days] = '3' THEN 1 END) AS Row_Count12
        , COUNT(CASE WHEN [days] = '12' THEN 1 END) AS Row_Count13
        , COUNT(CASE WHEN [days] = '23' THEN 1 END) AS Row_Count14
        , COUNT(CASE WHEN [days] = '123' THEN 1 END) AS Row_Count15
    FROM dbo.campRegistration 
    WHERE [days] IN ('1', '2', '3', '12', '23', '123')
        OR shirtSize IN ('S', 'M', 'L', 'XL', 'XXL')
        OR Staff = 'True'
        OR paidFull = 'True'
        OR campDate = @campDate

END
Run Code Online (Sandbox Code Playgroud)

有关重复扫描的其他信息,请阅读本主题.

  • 我欣赏真正的sql天才! (2认同)
  • 不要使用完整的`WHERE`子句.在这种情况下,它可能更快. (2认同)