2014-05-05 28 views
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 

在上述存儲過程中使用表變量可以嗎?

+1

由於您需要爲表中的每一行執行一個存儲過程,所以我不認爲您可以擺脫遊標,不幸的是。 –

回答

0

我解決了它與表變量的幫助,並從中刪除了光標的使用。下面是我使用的代碼:

DECLARE @AcctNum VARCHAR(50)='00011001990' 
DECLARE @AcctId INT = 58281 
DECLARE @GoodStandingAcctsTotal INT = 0 
DECLARE @GoodStandingAccts INT 
DECLARE @BadStandingAccts INT 
DECLARE @ExistingAccts INT 
DECLARE @BadStandingAcctsTotal INT = 0 
DECLARE @ExistingAcctsTotal INT  = 0 
DECLARE @i INT=1 
DECLARE @count INT 
DECLARE @TaxIDs VARCHAR(20) 
DECLARE @maxCount INT 
DECLARE @TableVariable TABLE 
(
Id INT IDENTITY(1,1), 
TaxID VARCHAR(20) 
)  
DECLARE @Temp table (ExistingAccts INT, GoodStandingAccts INT, BadStandingAccts INT, ClosedAccts INT) 

--Table Variable Use 
INSERT INTO @TableVariable(TaxID) 
    SELECT app.TaxID FROM DMApplicant app JOIN DMAccount acc ON app.CustNum = acc.CustNum where acc.AcctNum = @AcctNum 
    SELECT @maxCount=COUNT(Id) FROM @TableVariable 
    WHILE(@i<[email protected]) 
    BEGIN 
     SELECT @TaxIDs=TaxID from @TableVariable WHERE [email protected] 
     INSERT INTO @Temp 
     EXEC dbo.usp_naCheckExistingAccts @TaxIDs, @ExistingAccts OUTPUT, @GoodStandingAccts OUTPUT, @BadStandingAccts OUTPUT 

     SET @GoodStandingAcctsTotal = @GoodStandingAcctsTotal + @GoodStandingAccts 
     SET @BadStandingAcctsTotal = @BadStandingAcctsTotal + @BadStandingAccts 
     SET @ExistingAcctsTotal = @ExistingAcctsTotal + @ExistingAccts 
     SET @[email protected]+1 

    END 
相關問題