Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 sql server中游标的替代方案是什么_Sql Server 2008 - Fatal编程技术网

Sql server 2008 sql server中游标的替代方案是什么

Sql server 2008 sql server中游标的替代方案是什么,sql-server-2008,Sql Server 2008,我已经编写了一个使用游标的存储过程。我想删除这个游标,并想使用其他方法来提高查询性能。以下是程序: ALTER PROCEDURE [dbo].[usp_AOTGetExistingAccountInfoByAcctNum] @AcctNum VARCHAR(50), @AcctId INT = NULL AS BEGIN DECLARE @GoodStandingAcctsTotal INT = 0 DECLARE @BadStandingAcctsTotal INT = 0 DECLARE

我已经编写了一个使用游标的存储过程。我想删除这个游标,并想使用其他方法来提高查询性能。以下是程序:

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

在上面的存储过程中使用table变量可以吗?

我在table变量的帮助下解决了这个问题,并从中删除了游标的用法。下面是我使用的代码:

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<=@maxCount)
    BEGIN
        SELECT @TaxIDs=TaxID from @TableVariable WHERE Id=@i
        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 @i=@i+1

    END
DECLARE@AcctNum VARCHAR(50)='00011001990'
声明@AcctId INT=58281
声明@GoodStandingAcctsTotal INT=0
声明@goodstandingcts INT
声明@BADSTANDINGACTS INT
声明@ExistingAccts INT
声明@BadStandingAcctsTotal INT=0
声明@ExistingAcctsTotal INT=0
声明@i INT=1
声明@countint
声明@TaxIDs VARCHAR(20)
声明@maxCount INT
声明@TableVariable表
(
Id INT标识(1,1),
TaxID VARCHAR(20)
)    
声明@Temp表格(现有账户INT、良好账户INT、不良账户INT、关闭账户INT)
--表变量使用
插入@TableVariable(TaxID)
在app.CustNum=acc.CustNum上选择app.TaxID,其中acc.AcctNum=@AcctNum
从@TableVariable中选择@maxCount=COUNT(Id)

虽然(@iSince)您需要为表的每一行执行一个存储过程,但不幸的是,我认为您无法摆脱游标。