2010-11-09 9 views
2

Par exemple, le code ci-dessous, la flèche pointant sur deux parties, le second peut-il utiliser le résultat du premier, au lieu d'interroger à nouveau la base de données?Comment réutiliser le résultat de la sélection dans la procédure SQL SERVER

CREATE PROCEDURE GetInforEntries (@Count as int) AS 
BEGIN 
    SELECT TOP (@Count) * 
     from Table_Entries 
    where Retrived IS NULL    <----      

    IF @@ROWCOUNT > 0 
    BEGIN 

     UPDATE Table_Entries 
     SET Retrived = CURRENT_TIMESTAMP 
     WHERE id IN (SELECT TOP (@Count) id <---- 
         from Table_Entries 
        where Retrived IS NULL)  

    END 
END 

Répondre

4

Utilisez un CTE dans l'instruction UPDATE:

WITH sample AS (
    SELECT TOP(@count) 
     te.* 
    FROM TABLE_ENTRIES te 
    WHERE te.retrieved IS NULL) 
UPDATE sample 
    SET retrieved = CURRENT_TIMESTAMP 

Il n'y a pas besoin de vérifier @@ ROWCOUNT/etc - s'il n'y a pas de lignes correspondant où TABLE_ENTRIES.retrieved est nul, la requête n'a rien à mettre à jour.

Documentation

1

Vous pouvez déclarer une variable de table ou créer une table temporaire pour stocker les résultats de la première requête.

DECLARE @MyTempTable (column-list) 

INSERT INTO @MyTempTable (column-list...) 
SELECT TOP(@Count) * 
FROM Table_Entries 
WHERE Retrieved IS NULL 

-- display results of first query 
SELECT * 
FROM @MyTempTable 

IF @@ROWCOUNT > 0 
BEGIN 

    UPDATE Table_Entries 
    SET Retrived = CURRENT_TIMESTAMP 
    WHERE id IN (SELECT id <---- 
        from @MyTempTable)  

Cela ne sera bénéfique si vous voulez afficher les résultats de la première requête et si le nombre de lignes retournées dans la première requête améliore les performances dans la mise à jour.