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()
.
Vous voulez la clause OUTPUT
UPDATE Items SET Clicks = Clicks + 1
OUTPUT INSERTED.Name
WHERE Id = @Id
Accède à la table une seule fois:
UPDATE Items SET Clicks = Clicks + 1 , @Name = Name WHERE Id = @Id;
select @name;
Si vous utilisez SQL Server 2005 et les versions ultérieures, la clause OUTPUT est idéale pour cela.
Utilisez une procédure stockée pour cela.
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.
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'