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()
.
6 réponses
Vous voulez la clauseOUTPUT
UPDATE Items SET Clicks = Clicks + 1
OUTPUT INSERTED.Name
WHERE Id = @Id
N'accède à la table qu'une seule fois:
UPDATE Items SET Clicks = Clicks + 1 , @Name = Name WHERE Id = @Id;
select @name;
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.
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'