2009-03-31 24 views
47

Devo aggiornare una riga in una tabella e ottenere da essa un valore di colonna. Posso farlo conSQL: aggiornamento di una riga e restituzione di un valore di colonna con 1 query

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

Questo genera 2 piani/accessi alla tabella. È possibile in T-SQL modificare l'istruzione UPDATE per aggiornare e restituire la colonna Nome solo con 1 piano/accesso?

Utilizzo i metodi C#, ADO.NET ExecuteScalar() o ExecuteReader().

risposta

87

si desidera che la clausola di OUTPUT

UPDATE Items SET Clicks = Clicks + 1 
OUTPUT INSERTED.Name 
WHERE Id = @Id 
+0

Immagino che questo funzioni solo per SQL-2005 –

+0

E sopra, sì. Con SQL Server 2000, vedere Risposta dell'apprendimento –

+1

IIRC, la clausola OUTPUT è stata introdotta come parte di SQL Server 2005 Service Broker - http://msdn.microsoft.com/en-us/library/ms345108.aspx –

0

Utilizzare una procedura memorizzata per questo.

0

Creare una stored procedure che prende @id come parametro e fa entrambe le cose. Quindi si utilizza un DbDataAdapter per chiamare la stored procedure.

17

Accessi tavolo solo una volta:

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

L'approccio di Marc è molto migliore perché la mia query presuppone implicitamente che esiste un nome per un ID che potrebbe/non essere vero. – Learning

+1

Questo approccio non richiede l'utilizzo di una variabile di tabella. – crokusek

+0

Questo approccio è decisamente migliore, perché non dipende dai trigger di tabella. –

3

Se stai usando SQL Server 2005 in poi, il OUTPUT clause è ideale per questo

0

ho potuto non riesco ad aggiornare e restituire una riga all'interno di un'istruzione select. Io non puoi usare il valore selezionato tra le altre risposte.

Nel mio caso, ho voluto utilizzare il valore selezionato in una query. La soluzione che ho trovato è stata:

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' 
Problemi correlati