[英]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.Accnt
和ISNULL(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) = @year
和MONTH(dateCreated)
是不可SARG的,因此,如果dateCreated
列上有索引,查询优化器将跳过它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.