0
我有一個已經寫好的使用遊標的存儲過程。我想刪除這個遊標並想使用其他方法來獲得更好的查詢性能。以下是程序:什麼是在SQL服務器中的光標的替代方法
ALTER PROCEDURE [dbo].[usp_AOTGetExistingAccountInfoByAcctNum]
@AcctNum VARCHAR(50),
@AcctId INT = NULL
AS
BEGIN
DECLARE @GoodStandingAcctsTotal INT = 0
DECLARE @BadStandingAcctsTotal INT = 0
DECLARE @ExistingAcctsTotal INT = 0
DECLARE @GoodStandingAccts INT
DECLARE @BadStandingAccts INT
DECLARE @ExistingAccts INT
-- Temporary table created to suppress the result of procedure usp_naCheckExistingAccts in resultset
DECLARE @Temp table (ExistingAccts INT, GoodStandingAccts INT, BadStandingAccts INT, ClosedAccts INT)
DECLARE ExistingAcctCursor CURSOR FOR
(SELECT app.TaxID FROM DMApplicant app JOIN DMAccount acc ON app.CustNum = acc.CustNum where acc.AcctNum = @AcctNum)
DECLARE @TaxId INT
OPEN ExistingAcctCursor
FETCH NEXT FROM ExistingAcctCursor INTO @TaxId
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO @Temp
EXEC dbo.usp_naCheckExistingAccts @TaxID, @ExistingAccts OUTPUT, @GoodStandingAccts OUTPUT, @BadStandingAccts OUTPUT
SET @GoodStandingAcctsTotal = @GoodStandingAcctsTotal + @GoodStandingAccts
SET @BadStandingAcctsTotal = @BadStandingAcctsTotal + @BadStandingAccts
SET @ExistingAcctsTotal = @ExistingAcctsTotal + @ExistingAccts
FETCH NEXT FROM ExistingAcctCursor INTO @TaxId
END
CLOSE ExistingAcctCursor
DEALLOCATE ExistingAcctCursor
DECLARE @FloatException VARCHAR(10)
SELECT @FloatException = CASE
WHEN isRemoveHold IS NULL THEN ''
WHEN isRemoveHold = 1 THEN 'Yes'
WHEN isRemoveHold = 0 THEN 'No'
END
FROM Account WHERE AcctID = @AcctId
Select
dm.AcctNum,
dm.BranchDesc,
dm.AcctTypeNum,
dm.AcctTypeDesc,
dm.Acct_stat_cde,
dm.Lst_Dp_Amt,
dm.dtLastDeposit,
dm.dtOpen,
dm.dtLastTransaction,
dm.Prev_Day_Ytd_Avg_Lgr_Bal,
dm.TME_NSF_YTD_CNT,
dm.RTN_ITM_YTD_CNT,
dm.Avail_Bal,
dm.AVG_NEG_LGR_BAL,
@FloatException AS isRemoveHold,
CASE WHEN @BadStandingAcctsTotal = 0 AND @GoodStandingAcctsTotal > 0 THEN 'Yes' ELSE 'No' END AS isGoodStanding
From
AccountMatchExisting ame JOIN DMAccount dm ON RIGHT(Replicate('0',16) + ame.AcctNumMatch, 16) = RIGHT(Replicate('0',16) + dm.AcctNum, 16),
AccountmatchExisting am JOIN Account acc ON am.AcctNumMatch = acc.AcctNum
WHERE
dm.AcctNum = @AcctNum
END
在上述存儲過程中使用表變量可以嗎?
由於您需要爲表中的每一行執行一個存儲過程,所以我不認爲您可以擺脫遊標,不幸的是。 –