SQL: mettre à jour une ligne et renvoyer une valeur de colonne avec 1 requête

J'ai besoin de mettre à jour une ligne dans une table et d'en obtenir une valeur de colonne. Je peux le faire avec

UPDATE Items SET Clicks = Clicks + 1 WHERE Id = @Id;
SELECT Name FROM Items WHERE Id = @Id

Cela génère 2 plans / accès à la table. Est-il possible dans T-SQL de modifier l'instruction UPDATE afin de mettre à jour et de renvoyer la colonne Name Avec 1 plan/access uniquement?

J'utilise C#, ADO.NET méthodes ExecuteScalar() ou ExecuteReader().

48
demandé sur Robert 2009-03-31 16:52:16

6 réponses

Vous voulez la clauseOUTPUT

UPDATE Items SET Clicks = Clicks + 1
OUTPUT INSERTED.Name
WHERE Id = @Id
89
répondu Marc Gravell 2009-03-31 12:55:18

N'accède à la table qu'une seule fois:

UPDATE Items SET Clicks = Clicks + 1 , @Name = Name WHERE Id = @Id;
select @name;
17
répondu Learning 2009-03-31 12:55:16

Si vous utilisez SQL Server 2005 à partir, la clause de sortie est idéale pour cela

3
répondu Russ Cam 2009-03-31 12:56:55

Utilisez une procédure stockée pour cela.

0
répondu Rashack 2009-03-31 12:54:52

Créez une procédure stockée qui prend le @ id comme paramètre et fait ces deux choses. Vous utilisez ensuite un DbDataAdapter pour appeler la procédure stockée.

0
répondu BFree 2009-03-31 12:54:57

Je n'ai pas réussi à mettre à jour et à renvoyer une ligne dans une instruction select. C'est-à-dire que vous ne pouvez pas utiliser la valeur sélectionnée parmi les autres réponses.

Dans mon cas, je voulais utiliser la valeur sélectionnée dans une requête. La solution que j'ai trouvée était:

declare @NextId int
set @NextId = (select Setting from Settings where key = 'NextId')

select @NextId + ROW_NUMBER() over (order by SomeColumnOfYourTable) from YourTable

update Settings set Setting = Setting + @@ROWCOUNT 
where key = 'NextId'
0
répondu Kobbe 2017-10-31 14:04:41