2010-09-17 5 views
5

J'ai un sp SQL Server à l'aide d'un curseur ainsi:lignes de comptage avant de traiter avec un curseur tsql

DECLARE TestCursor CURSOR FOR 
    SELECT 
     tblHSOutcomes.strOutcomeName, 
     tblHSData.fkHSTest 
    FROM 
     tblHSData 
     INNER JOIN tblHSOutcomes ON tblHSData.fkOutcome = tblHSOutcomes.uidOutcome 
     INNER JOIN tblHSTests ON tblHSData.fkHSTest = tblHSTests.uidTest 
    WHERE 
     tblHSData.fkEpisode = @uidHSEpisodes 

OPEN TestCursor 
    FETCH NEXT FROM TestCursor 
    INTO @Result, @TestID 

WHILE @@FETCH_STATUS = 0 
BEGIN 
...etc 

Il fonctionne très bien, mais il serait agréable d'être en mesure de vérifier si la requête de curseurs a des enregistrements avant de continuer à traiter à travers elle. s'il y a un @ @ var que je peux utiliser pour vérifier cela? Je sais qu'il ya @@ RowCount - mais cela n'a que le nombre actuel de lignes traitées - est donc pas très utile

idéalement je voudrais pouvoir faire quelque chose comme ceci:

if @@cursorQueryHasRecords 
BEGIN 
WHILE @@FETCH_STATUS = 0 
BEGIN 
...etc 

grâce

nat

+6

Et pourquoi vous ne pouvez pas utiliser @@ FETCH_STATUS lui-même? – Arvo

+0

Et avez-vous vraiment besoin d'un curseur, ils sont souvent le pire choix. http://wiki.lessthandot.com/index.php/Cursors_and_How_to_Avoid_Them – HLGEM

Répondre

4
if exists(
    SELECT 
     tblHSOutcomes.strOutcomeName, 
     tblHSData.fkHSTest 
    FROM 
     tblHSData 
     INNER JOIN tblHSOutcomes ON tblHSData.fkOutcome = tblHSOutcomes.uidOutcome 
     INNER JOIN tblHSTests ON tblHSData.fkHSTest = tblHSTests.uidTest 
    WHERE 
     tblHSData.fkEpisode = @uidHSEpisodes 
) 
... 
+0

Salut merci pour la réponse. comment je wrap que dans le bit de curseur .. ne veux pas exécuter cette requête deux fois .. Vraisemblablement je ne peux pas faire decalre test curseur curseur pour si existe (sélectionnez .... – nat

Questions connexes