web-dev-qa-db-fra.com

SQL: met à jour une ligne et renvoie une valeur de colonne avec 1 requête

Je dois mettre à jour une ligne dans une table et 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 Nom avec 1 plan/accès uniquement?

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

49
Robert

Vous voulez la clause OUTPUT

UPDATE Items SET Clicks = Clicks + 1
OUTPUT INSERTED.Name
WHERE Id = @Id
90
Marc Gravell

Accède à la table une seule fois:

UPDATE Items SET Clicks = Clicks + 1 , @Name = Name WHERE Id = @Id;
select @name;
18
Learning

Si vous utilisez SQL Server 2005 et les versions ultérieures, la clause OUTPUT est idéale pour cela.

3
Russ Cam

Utilisez une procédure stockée pour cela.

0
Rashack

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

0
BFree

Je n'arrivais pas à mettre à jour et à retourner une ligne dans une instruction select . Ie vous ne pouvez pas utiliser la valeur sélectionnée des 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
Kobbe