【问题标题】:SQL Cursor Processing Control Break logicSQL 游标处理控制中断逻辑
【发布时间】:2011-10-12 18:43:40
【问题描述】:

这就是我们仍然在 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

【问题讨论】:

  • 您可以将相关子查询添加到 SELECT 以获取 NextCompanyName。您将获得最后一家公司的 NULL。

标签: sql sql-server tsql


【解决方案1】:

不用游标也可以查询每家公司的行数:

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

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

【讨论】:

  • 我必须为第一条和最后一条记录做一些不同的事情才能将它们包含在内。这看起来好吗?我将它们标记为 PRIMER 并处理最后一条记录。
  • 您可以将“@CompanyNameHold”初始化为 NULL。您的意思是在某处增加“@TestCount”吗?
  • 原来我不需要@TestCount,抱歉。
猜你喜欢
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
  • 2014-03-21
  • 2016-11-14
  • 1970-01-01
  • 1970-01-01
  • 2017-05-01
  • 1970-01-01
相关资源
最近更新 更多