繁体   English   中英

如何在存储过程中做到这一点?

[英]How to do this in stored procedure?

这是我的存储过程

CREATE PROCEDURE Test_SP
        @from int,
        @to int,
        @year int,
        @office varchar(MAX),
        @fund varchar(MAX)
AS             
SELECT        
        AccntTbl.Id,
         AccntTbl.accnt,
          ISNULL(SupplyTbl.Supply, 0) AS Supply,
           AccntTbl.office,
            AccntTbl.exp,                 
        AccntTbl.dateCreated 
FROM         AccntTbl 
LEFT OUTER JOIN
     (SELECT idAccnt, 
             SUM(amount) AS Supply
     FROM      SuppyTbl AS SupplyTbl1
     WHERE      (MONTH(dateCreated) BETWEEN @from AND @to) AND
                (YEAR(dateCreated) = @year) AND fund = @fund
     GROUP BY     idAccnt) AS SupplyTbl     
WHERE  YEAR(AccntTbl.dateCreated) = @year AND 
            AccntTbl.office = @office AND
             AccntTbl.fund = @fund 
GROUP BY AccntTbl.Id,
          AccntTbl.accnt,
            AccntTbl.appro,
              Supply.Supply

在这里从VB.NET打电话

  conn.Open()
    Dim cmd As New SqlCommand("Test_SP", conn)
    With cmd
        .CommandType = CommandType.StoredProcedure
        .Parameters.Add("@from", SqlDbType.VarChar).Value = Int32.Parse(TextBox1.Text)
        .Parameters.Add("@to", SqlDbType.VarChar).Value = Int32.Parse(TextBox2.Text)
        .Parameters.Add("@year", SqlDbType.VarChar).Value = Int32.Parse(YearLbl.Text)
        .Parameters.Add("@office", SqlDbType.VarChar).Value = Dashboard.OfficeTxt.Text
        .Parameters.Add("@fund", SqlDbType.VarChar).Value = FundLbl.Text
    End With

我如何只在TEST_SP检索其某些字段,就像我只希望将AccntTbl.AccntISNULL(SupplyTbl.Supply, 0) as supply

这是我已经做过的示例代码

Dim cmd As New SqlCommand("Select AccntTbl.Accnt, ISNULL(SupplyTbl.Supply, 0) as supply from Test_SP", conn)

我知道这是错误的,它说“无法找到存储过程” ...大声笑,很高兴提供帮助:)

一种方法是使用用户定义的表值函数

CREATE FUNCTION [dbo].[Test_SP]
(       @from int,
        @to int,
        @year int,
        @office varchar(MAX),
        @fund varchar(MAX)
)
RETURNS TABLE
AS
RETURN (
  SELECT AccntTbl.Id,
         AccntTbl.accnt,
         ISNULL(SupplyTbl.Supply, 0) AS Supply,
         AccntTbl.office,
         AccntTbl.exp,                 
         AccntTbl.dateCreated 
  FROM AccntTbl 
  LEFT JOIN
     (SELECT idAccnt, 
             SUM(amount) AS Supply
     FROM SuppyTbl AS SupplyTbl1
     WHERE MONTH(dateCreated) BETWEEN @from AND @to 
       AND YEAR(dateCreated) = @year 
       AND fund = @fund
     GROUP BY idAccnt) AS SupplyTbl     
  WHERE YEAR(AccntTbl.dateCreated) = @year 
    AND AccntTbl.office = @office 
    AND AccntTbl.fund = @fund 
  GROUP BY AccntTbl.Id,
           AccntTbl.accnt,
           AccntTbl.appro,
           Supply.Supply
);

查询:

SELECT Accnt, Supply
FROM [dbo].[Test_SP](1, 12, 2015, 'Baltimore', 'aaa');

请注意,条件YEAR(dateCreated) = @yearMONTH(dateCreated)不可SARG的,因此,如果dateCreated列上有索引,查询优化器将跳过它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM