SQL游标处理控制中断逻辑

SQL游标处理控制中断逻辑,sql,sql-server,tsql,Sql,Sql Server,Tsql,这就是我们在sql游标中处理控件中断逻辑的方式吗 基本上,我想做的是循环浏览一个帐户列表,如果下一个帐户名称与前一个相同,则执行许多其他操作 下面的示例仅列出了所有帐户以及它们在列表中出现的次数。理想情况下,我会在每种情况下做更多的处理(比如调用几个存储的进程)。还有别的办法吗 DECLARE @CompanyName NVARCHAR(255) DECLARE @CompanyNameHold NVARCHAR(255) DECLARE @TESTCOUNT INT DECLARE @TOTA

这就是我们在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
DECLARE@CompanyName NVARCHAR(255)
声明@CompanyNameHold NVARCHAR(255)
声明@testcountint
声明@TOTALCOUNT INT
选择@CompanyNameHold=''
选择@TESTCOUNT=0
选择@TOTALCOUNT=0
为声明导入游标
选择[公司名称]
来自[MyDB].[dbo].[AccountsToImport]
由[公司名称]订购
开放式导入器
从ImportCursor获取下一个到@CompanyName
而@@FETCH\u STATUS=0
开始
--选中HoldCompanyName=CompanyName
IF(@CompanyName@CompanyNameHold)
开始
--处理新帐户
如果@TESTCOUNT=0——引物
设置@CompanyNameHold=@CompanyName
其他的
打印强制转换(@TESTCOUNT AS NVARCHAR)+'-'+@CompanyNameHold
设置@TESTCOUNT=1
结束
其他的
开始
--添加到现有的
设置@TESTCOUNT=@TESTCOUNT+1
结束
--将CompanyName移动到HoldCompanyName
设置@CompanyNameHold=@CompanyName
设置@TOTALCOUNT=@TOTALCOUNT+1
从ImportCursor获取下一个到@CompanyName
结束
--处理最后记录
打印强制转换(@TESTCOUNT AS NVARCHAR)+'-'+@CompanyNameHold
关闭导入器
取消分配导入器

您可以在不使用光标的情况下查询每个公司的行数:

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

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

我必须对第一条和最后一条记录做一些不同的操作才能将它们包括在内。看起来可以吗?我将它们标记为PRIMER并处理最后一条记录。您可以将“@CompanyNameHold”初始化为NULL。你是想在某个地方增加“@TestCount”吗?事实证明我不需要@TestCount,很抱歉。你可以向SELECT添加一个相关子查询以获取下一个公司名。最后一家公司的回执为空。