2011-07-28 4 views
1

J'essaie de sélectionner les lignes une par une dans une boucle while dans SQL Server. Et j'utilise la seule façon que je connais pour sélectionner la ligne suivante en utilisant la fonction ROW_NUMBER. Mais je dois aussi assigner des valeurs aux variables t-sql dans la même instruction SELECT, donc j'obtiens l'erreur suivante;SELECT() ligne suivante dans l'instruction d'affectation de valeur?

instruction SELECT qui attribue une valeur à une variable ne doit pas être combiné avec des opérations de récupération des données.

Quoi qu'il en soit mon code est comme ceci;

WHILE (@i < 5) 
    BEGIN 
     SELECT -- This is where the error occurs 
      @resultId = video.id, -- this is the value assigning i need to do 
      ROW_NUMBER() OVER (ORDER BY dateAdded DESC) AS ROWID 
     FROM videoTest.dbo.video 
     LEFT JOIN videoTest.dbo.aspnet_Users 
     ON video.userId=aspnet_Users.UserId 
     WHERE [email protected] AND ROWID = @i 

    -- Processing @resultId  
     SELECT 
      compilationId 
     FROM videoTest.dbo.comp 
     WHERE vidId = @resultId -- i need the id from above 
     .... 
     .... 
     ..... 
     ...... 

    @i = @i + 1 
    END 

Je serais beaucoup apprécié si vous pouvez me montrer moyen de sélection suivant d'une autre manière sans obtenir cette erreur, ou un moyen de résoudre cette erreur dans mon code actuel. Merci.

Répondre

4

Vous devez séparer la sélection des données de la récupération de ces données dans une variable. Vous pouvez utiliser par exemple un CTE (Common Table Expression) pour configurer les données, puis opérer sur ces données. Cependant, à un niveau plus basique: pourquoi attribuez-vous le id à @resultId cinq fois? Vous ne semblez pas faire quoi que ce soit avec le @resultId pendant ce temps .....

Pourriez-vous changer votre logique pour être plus basé sur les ensembles? Au lieu d'une WHILE construction - il suffit de sélectionner les valeurs appropriées du CTE:

;WITH VideoData AS 
(
    SELECT 
     video.id, 
     ROW_NUMBER() OVER (ORDER BY dateAdded DESC) AS ROWID 
    FROM 
     videoTest.dbo.video 
    LEFT JOIN 
     videoTest.dbo.aspnet_Users ON video.userId = aspnet_Users.UserId 
    WHERE 
     aspnet_Users.UserName = @searchUserName 
) 
SELECT id, ROWID 
FROM VideoData 
WHERE ROWID <= 5 

Mise à jour: si vous avez besoin des cinq video.id valeurs pour un traitement ultérieur, essayez quelque chose comme ceci:

DECLARE @VideoIDs TABLE (VideoID INT) 

;WITH VideoData AS 
(
    ... (same as before) 
) 
INSERT INTO @VideoIDs(VideoID) 
    SELECT id 
    FROM VideoData 
    WHERE ROWID <= 5 

-- use your values in the table variable here..... 
+0

le code continue à partir de là et j'utilise ces 5 identifiants vidéo différents désolé pour malentendu. Je pense que c'est ce que je cherche, laissez-moi prendre mes chances, merci! – umutto

+0

désolé de ne pas être assez clair plus tôt mais j'ai implémenté votre code mais pas tout à fait trouvé un moyen d'accéder à video.id sur une dernière déclaration. Avec CTE existe-t-il un moyen de sauvegarder le video.id en tant que variable pour une utilisation future? J'ai besoin de @resultId pour les processus plus tard, j'ai mis à jour mon code pour mes besoins. Je vous remercie! – umutto

+0

@umutto: si vous en avez besoin plus tard, vous devez l'insérer dans une variable de table - le CTE n'est valide que pour l'instruction suivante, immédiate –

0

Je vois que vous avez besoin de video.id. Pourquoi ne pas simplement commander par dateAdded, et le stocker dans un curseur:

SELECT 
    INTO CURSOR @SomeCursor 
    video.id 
    FROM videoTest.dbo.video 
    LEFT JOIN videoTest.dbo.aspnet_Users 
    ON video.userId=aspnet_Users.UserId 
    WHERE [email protected] 
    ORDER BY dateAdded DESC 

puis itérer @SomeCursor?

+0

EDIT: Oh désolé j'ai raté la partie du curseur pouvez-vous s'il vous plaît montrer un code simple pour l'implémentation du curseur. – umutto

+0

Vous avez besoin de ROWID ou juste l'id? – CristiC

+0

non je juste besoin d'id vous avez raison je vous ai mal compris sur mon premier commentaire. Bien que je ne suis pas familier avec l'utilisation des curseurs. J'apprécierais un simple bloc de code. Merci! – umutto

Questions connexes