2011-10-12 2 views
0

Est-ce que nous traitons toujours la logique de rupture de contrôle dans les curseurs SQLSQL curseur Traitement de contrôle Pause logique

Fondamentalement, ce que je veux faire est de boucle à travers une liste de comptes et si le prochain nom de compte est le même que le le précédent fait beaucoup de choses font beaucoup d'autres choses.

L'exemple ci-dessous liste uniquement tous les comptes et le nombre de fois qu'ils apparaissent dans la liste. Idéalement, je ferai plus de traitement dans chaque cas (comme appeler plusieurs procs stockés). Y a-t-il une autre façon de faire cela?

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

Vous pouvez ajouter une sous-requête corrélée au SELECT pour sélectionner NextCompanyName. Vous obtiendrez une valeur NULL pour la dernière société. – HABO

Répondre

1

Vous pouvez interroger le nombre de lignes par entreprise sans curseur:

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

Mais pour appeler une procédure stockée pour chaque ligne, un curseur est nécessaire. Vous pouvez appeler n'importe quel nombre de procédures stockées en bouclant le curseur.

+0

J'ai dû faire quelque chose de différent pour le premier et le dernier enregistrement pour les inclure. Est-ce que ça a l'air ok? Je les ai étiquetés PRIMER et Process Last Record. – Rod

+0

Vous pouvez initialiser '@CompanyNameHold' à NULL. Voulez-vous ajouter "@TestCount" quelque part? – HABO

+0

s'avère que je n'avais pas besoin de @TestCount, désolé pour cela. – Rod