さて、私の SQL Server 2005 データベースには次の手順があります。なぜ結果が得られないのかを理解しようとしています。アクセスしようとしているユーザーは管理者ですが、別のユーザーでアクセスしようとしましたが、まだ結果が得られません。Bond は、Bond テーブルの基本クエリで返されます。これが結果を返さない理由を理解しようとしています。どんな助けでも大歓迎です。
ALTER PROCEDURE dbo.GetBondAmounts
(
@Username varchar(20)
)
AS
DECLARE @Admin AS bit
SELECT @Admin = Admin FROM Users WHERE Username = @Username
if(@Admin = 1)
BEGIN
RETURN
SELECT Bond.ID, SUM(Charge.BondAmount) + SUM(ChargeWithoutPower.BondAmount) Amount,
SUM(Charge.BondPremium) + SUM(ChargeWithoutPower.BondPremium) + SUM(Forfeiture.AmountPaid)
+ SUM(Forfeiture.CostOfApprehension) - SUM(Payment.Amount) - SUM(BalanceForgiveness.AmountForgiven) Balance
FROM Bond LEFT OUTER JOIN Payment ON Bond.ID = Payment.Bond
LEFT OUTER JOIN BalanceForgiveness ON Bond.ID = BalanceForgiveness.BondID
LEFT OUTER JOIN Powers ON Bond.ID = Powers.Bond
LEFT OUTER JOIN Charge ON Powers.Surety = Charge.PowerSurety
AND Powers.PowerPrefix = Charge.PowerPrefix AND Powers.PowerNumber = Charge.PowerNumber
LEFT OUTER JOIN ChargeWithoutPower ON Bond.ID = ChargeWithoutPower.ID
LEFT OUTER JOIN Forfeiture ON Bond.ID = Forfeiture.Bond
LEFT OUTER JOIN BondFee ON Bond.ID = BondFee.Bond
GROUP BY Bond.ID
END
ELSE
BEGIN
RETURN
SELECT Bond.ID, SUM(Charge.BondAmount) + SUM(ChargeWithoutPower.BondAmount) Amount,
SUM(Charge.BondPremium) + SUM(ChargeWithoutPower.BondPremium) + SUM(Forfeiture.AmountPaid)
+ SUM(Forfeiture.CostOfApprehension) - SUM(Payment.Amount) - SUM(BalanceForgiveness.AmountForgiven) Balance
FROM Bond LEFT OUTER JOIN UserAgency ON Bond.Agency = UserAgency.Agency
LEFT OUTER JOIN Payment ON Bond.ID = Payment.Bond
LEFT OUTER JOIN BalanceForgiveness ON Bond.ID = BalanceForgiveness.BondID
LEFT OUTER JOIN Powers ON Bond.ID = Powers.Bond
LEFT OUTER JOIN Charge ON Powers.Surety = Charge.PowerSurety
AND Powers.PowerPrefix = Charge.PowerPrefix AND Powers.PowerNumber = Charge.PowerNumber
LEFT OUTER JOIN ChargeWithoutPower ON Bond.ID = ChargeWithoutPower.ID
LEFT OUTER JOIN Forfeiture ON Bond.ID = Forfeiture.Bond
LEFT OUTER JOIN BondFee ON Bond.ID = BondFee.Bond
WHERE UserAgency.Username = @Username
GROUP BY Bond.ID
END
次のように C# を使用してこの手順にアクセスしています。
bondingData.Merge(getBondAmountsAdapter.GetData(currentUser.Username));
これは、結果が返されたかどうかをテストして確認するために追加した行です。
MessageBox.Show("Bond Count A: " + bondingData.Bond.Count.ToString() + "\r\nBond Count B: " + bondingData.GetBondAmounts.Count.ToString());
私がそれを実行したとき、これが私が受け取った結果です:
Bond Count A: 1
Bond Count B: 0
[編集]
OK、これが私の問題に対する私の解決策です:
ALTER PROCEDURE dbo.GetBondAmounts
(
@Username varchar(20)
)
AS
SELECT Bond.ID, dbo.GetBondTotal(Bond.ID) Total, dbo.GetBondBalance(Bond.ID) Balance
FROM Bond LEFT OUTER JOIN
UserAgency ON Bond.Agency = UserAgency.Agency
WHERE UserAgency.Username = @Username
OR EXISTS (SELECT * FROM Users WHERE Username = @Username AND Admin = 1)
GROUP BY Bond.ID
これらは、ここで呼び出される 2 つのストアド関数です。それがどれほど効率的かはわかりませんが、それほど多くの支払いや個々の債券に関連するものはありません. プログラムに多くのレコードがあると、遅くなる可能性があります。
機能 1:
ALTER FUNCTION dbo.GetBondTotal
(
@BondID bigint
)
RETURNS money
AS
BEGIN
DECLARE @PowersTotal AS money;
DECLARE @ChargesTotal AS money;
DECLARE @BondFeeTotal AS money;
DECLARE @ForfeitureCosts AS money;
SELECT @PowersTotal = SUM(BondPremium)
FROM Charge INNER JOIN Powers ON Charge.PowerSurety = Powers.Surety
AND Charge.PowerPrefix = Powers.PowerPrefix
AND Charge.PowerNumber = Powers.PowerNumber
WHERE Bond = @BondID
SELECT @ChargesTotal = SUM(BondPremium)
FROM ChargeWithoutPower
WHERE BondID = @BondID
SELECT @BondFeeTotal = SUM(Amount)
FROM BondFee WHERE Bond = @BondID
SELECT @ForfeitureCosts = SUM(CostOfApprehension) + SUM(AmountPaid)
FROM Forfeiture WHERE Bond = @BondID
RETURN @PowersTotal + @ChargesTotal + @BondFeeTotal + @ForfeitureCosts
END
機能 2:
ALTER FUNCTION dbo.GetBondBalance
(
@BondID bigint
)
RETURNS MONEY
AS
BEGIN
DECLARE @PowersTotal AS money;
DECLARE @ChargesTotal AS money;
DECLARE @BondFeeTotal AS money;
DECLARE @ForfeitureCosts AS money;
DECLARE @PaymentTotal AS money;
DECLARE @AmountForgiven AS money;
SELECT @PowersTotal = SUM(BondPremium)
FROM Charge INNER JOIN Powers ON Charge.PowerSurety = Powers.Surety
AND Charge.PowerPrefix = Powers.PowerPrefix
AND Charge.PowerNumber = Powers.PowerNumber
WHERE Bond = @BondID
SELECT @ChargesTotal = SUM(BondPremium)
FROM ChargeWithoutPower
WHERE BondID = @BondID
SELECT @BondFeeTotal = SUM(Amount)
FROM BondFee WHERE Bond = @BondID
SELECT @ForfeitureCosts = SUM(CostOfApprehension) + SUM(AmountPaid)
FROM Forfeiture WHERE Bond = @BondID
SELECT @PaymentTotal = SUM(Amount)
FROM Payment WHERE Bond = @BondID
SELECT @AmountForgiven = SUM(AmountForgiven)
FROM BalanceForgiveness WHERE BondID = @BondID
RETURN @PowersTotal + @ChargesTotal + @BondFeeTotal + @ForfeitureCosts - @PaymentTotal - @AmountForgiven
END
金額 (Charge.Amount + ChargeWithoutPower.Amount) をカバーする 3 番目の関数を作成すると思います。