SQL游标处理控制中断逻辑

时间:2011-10-12 18:43:40

标签: sql sql-server tsql

这是我们如何处理sql游标中的控制中断逻辑

基本上,我想要做的是循环查看一个帐户列表,如果下一个帐户名称与前一个帐户名称相同,那么其他许多事情还会做很多其他事情。

下面的示例列出了所有帐户以及它们在列表中出现的次数。理想情况下,我会在每种情况下进行更多处理(比如调用几个存储过程)。还有另一种方法吗?

DECLARE @CompanyName NVARCHAR(255)
DECLARE @CompanyNameHold NVARCHAR(255)
DECLARE @TESTCOUNT INT
DECLARE @TOTALCOUNT INT

SELECT @CompanyNameHold = ''
SELECT @TESTCOUNT = 0
SELECT @TOTALCOUNT = 0

DECLARE ImportCursor CURSOR FOR
SELECT [Company Name]
  FROM [MyDB].[dbo].[AccountsToImport]
  ORDER BY [Company Name]


OPEN ImportCursor
FETCH NEXT FROM ImportCursor INTO @CompanyName

WHILE @@FETCH_STATUS = 0
BEGIN


    --Check HoldCompanyName = CompanyName   
    IF (@CompanyName <> @CompanyNameHold)   
    BEGIN   
        --PROCESS NEW ACCOUNT
        IF @TESTCOUNT = 0 --PRIMER
            SET @CompanyNameHold = @CompanyName
        ELSE        
            PRINT CAST(@TESTCOUNT AS NVARCHAR) + ' - ' + @CompanyNameHold 

        SET @TESTCOUNT = 1
    END
    ELSE
    BEGIN
        --ADD TO EXISTING
        SET @TESTCOUNT = @TESTCOUNT + 1
    END


    --Move CompanyName to HoldCompanyName
    SET @CompanyNameHold = @CompanyName
    SET @TOTALCOUNT = @TOTALCOUNT + 1

    FETCH NEXT FROM ImportCursor INTO @CompanyName
END
    --Process Last Record 
    PRINT CAST(@TESTCOUNT AS NVARCHAR) + ' - ' + @CompanyNameHold 

CLOSE ImportCursor
DEALLOCATE ImportCursor

1 个答案:

答案 0 :(得分:1)

您可以在没有光标的情况下查询每家公司的行数:

select  [Company Name]
,       count(*) as RowsPerCompany
from    MyDB.dbo.AccountsToImport
group by
        [Company Name]

但是要为每一行调用存储过程,需要一个游标。您可以在循环游标时调用任意数量的存储过程。