2010-02-01 3 views
2

J'ai une requête comme ceci:efficace requête SQL pour deux mises à jour et la recherche requêtes

SELECT TOP 1 ID, DATA, OTHERINF FROM MYTABLE WHERE DATE = @DATE 

et après avoir lu les données de la ligne et l'utiliser je veux mettre à jour cette ligne récupérée et changer l'un de ses colonnes (en une autre transaction). Mais comme vous voyez ici, j'ai cherché deux fois cette ligne. Est-il possible que je garde le souvenir de la ligne et fasse la mise à jour sans chercher à nouveau.

Merci.

+2

huh ??????????? – JonH

+0

Basé sur les commentaires que vous donnez, je pense que cette question doit être retravaillée pour indiquer ce que vous essayez d'accomplir –

+0

Maximiser l'efficacité. Une sorte de pointeur qui pointe vers la ligne pour la changer facilement. – Shayan

Répondre

0

Je sais que c'est hors de la mode, mais vous pouvez également faire des mises à jour positionnées sur les curseurs par exemple.

use Northwind 
GO 



DECLARE EMP_CURSOR CURSOR 
FOR SELECT TOP 1 EmployeeID, LastName FROM EMPLOYEES WHERE HireDate = '1994-11-15' 
FOR UPDATE OF LastName 

OPEN EMP_CURSOR 

FETCH NEXT FROM EMP_CURSOR 

UPDATE EMPLOYEES 
SET LastName = LastName + CAST(DatePart(ms,GetDate()) as char(3)) 
WHERE CURRENT OF EMP_CURSOR 


CLOSE EMP_CURSOR 

DEALLOCATE EMP_CURSOR 
+0

Les curseurs restent-ils entre les différentes transactions? – Shayan

+0

Les curseurs restent ouverts jusqu'à ce qu'ils soient fermés ou que la connexion soit fermée. Cela dépend donc beaucoup de vous. Notez que 2005 a ajouté des mots-clés LOCAL et GLOBAL aux curseurs –

0
--Note, need to setup proper data types 
DECLARE @Id INT 
DECLARE @Data VARCHAR(MAX) 
DECLARE @OtherInf VARCHAR(max) 

SELECT TOP 1 @id = Id, @Data = Data, @OtherInf = OtherInf 
FROM MyTable 
WHERE Date = @Date 

--Now you can do what you need, using the info above. 

Cela devrait le faire

+0

Mais je voulais un moyen de ne pas chercher deux fois. Votre solution vient de fournir des informations pas un moyen de résoudre le problème. – Shayan

+0

Vous notez que vous souhaitez utiliser l'information dans une autre transaction, par conséquent, je suppose que vous avez un traitement intermédiaire. –

4

Dans la première requête que vous avez récupéré l'id. Dans la deuxième utilisation de requête pour trouver la ligne de mise à jour au lieu d'utiliser la date:

UPDATE MYTABLE 
SET DATA = 'FooBar' 
WHERE ID = 200 
+0

Notez que cela suppose que l'ID est PK ou au moins indexé. –

+0

+1 Plus besoin de chercher tant que vous vous accrochez à une colonne indexée. – Jon

+0

Mais de cette façon, je devrais avoir un index sur id. Une meilleure façon? – Shayan

0

Vous pouvez combiner les UPDATE avec SELECT dans une instruction, mais pas sur deux transactions. Par conséquent, si vous avez besoin de mettre à jour la valeur dans une autre transaction que vous l'avez sélectionnée (la raison de cela n'est pas claire pour moi), vous avez besoin de deux instructions.

0

Je présume que la colonne DATE n'est pas indexée (sinon, pourquoi?) Votre meilleur pari, alors, est de vous assurer que vous récupérez la clé primaire (n'est-ce pas ID?), Puis l'utiliser comme votre état dans la mise à jour.

+0

J'ai un index le DATE. – Shayan

Questions connexes