2012-02-03 18 views
5

Ho una procedura memorizzata e sto provando a fare in modo che i risultati che porta giù aggiorni anche una colonna chiamata Downloaded e contrassegna quelle file come download.Selezionare e aggiornare in una procedura memorizzata

Ad esempio, tiro giù 10 righe di quelle 10 righe Voglio anche aggiornare la colonna Downloaded su true nella stessa stored procedure. È possibile?

Questa è la mia sp finora, abbassa i dati.

ALTER PROCEDURE [dbo].[GetLeads] 
@DateTo datetime = null, 
@DateFrom datetime = null 
AS 
    SELECT name 
     , lastname 
     , title 
     , company 
     , address 
     , address2 
     , city 
     , [state] 
     , zip 
     , country 
     , stamptime 

    FROM 
     lead 
    where 
     ((@DateTo is null AND @DateFrom IS null) or (stamptime BETWEEN @DateTo AND @DateFrom)) 

Grazie!

+1

Forse non ho avuto il problema, ma 'UPDATE piombo SET Scaricato = TRUE WHERE ((@DateTo è nullo e @DateFrom è nullo) o (stamptime TRA @DateTo E @DateFrom)) '?? – vulkanino

risposta

4

Continuando il commento la risposta di vulkanino, qualcosa di simile:

ALTER PROCEDURE [dbo].[GetLeads] 
@DateTo datetime = null, 
@DateFrom datetime = null 
AS 
    UPDATE 
     lead 
    SET  
     Downloaded = 1 
    WHERE 
     ((@DateTo is null AND @DateFrom IS null) or (stamptime BETWEEN @DateTo AND @DateFrom)) 

    SELECT name 
     , lastname 
     , title 
     , company 
     , address 
     , address2 
     , city 
     , [state] 
     , zip 
     , country 
     , stamptime 

    FROM 
     lead 
    where 
     ((@DateTo is null AND @DateFrom IS null) or (stamptime BETWEEN @DateTo AND @DateFrom)) 
11

si può semplicemente OUTPUT le righe aggiornate;

UPDATE lead 
    SET Downloaded = 1 
OUTPUT INSERTED.* 
    WHERE ((@DateTo is null AND @DateFrom IS null) or (stamptime BETWEEN @DateTo AND @DateFrom)) 

Questo aggiornamento, quindi restituisce le righe aggiornate in una singola istruzione.

+1

+1 semplicemente geniale! –

+0

Ho usato questa soluzione con DELETED. * (Anziché INSERTED. *) Per restituire i valori del campo _orginal_, cioè i valori prima dell'applicazione di UPDATE. –

2

La soluzione migliore potrebbe essere quella di utilizzare un'istruzione OUTPUT con UPDATE.

http://blog.sqlauthority.com/2007/10/01/sql-server-2005-output-clause-example-and-explanation-with-insert-update-delete/

DECLARE @TEMPTABLE 
(
    name <type> 
    , lastname <type> 
    , title <type> 
    , company <type> 
    , address <type> 
    , address2 <type> 
    , city <type> 
    , state <type> 
    , zip <type> 
    , country <type> 
    , stamptime <type> 
) 

UPDATE a 
SET a.Downloaded = 1 
OUTPUT Inserted.name, Inserted.lastname, Inserted.title, etc. INTO @TEMPTABLE 
FROM lead a 
WHERE ((@DateTo IS NULL AND @DateFrom IS NULL) OR (a.stamptime BETWEEN @DateTo AND @DateFrom)) 

SELECT * FROM @TEMPTABLE 
Problemi correlati