这是我们如何处理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
答案 0 :(得分:1)
您可以在没有光标的情况下查询每家公司的行数:
select [Company Name]
, count(*) as RowsPerCompany
from MyDB.dbo.AccountsToImport
group by
[Company Name]
但是要为每一行调用存储过程,需要一个游标。您可以在循环游标时调用任意数量的存储过程。