2012-02-03 10 views
5

Mam wybraną procedurę składowaną i próbuję ją wykonać, aby wyniki, które ona spowodowała, aktualizowały również kolumnę o nazwie Downloaded i oznaczały te wiersze jako pobrane.Wybieranie i aktualizowanie w jednej przechowywanej procedurze

Na przykład, ściągam 10 wierszy tych 10 wierszy, które również chcę zaktualizować do kolumny true, wszystkie w tej samej procedurze składowanej. czy to możliwe?

To jest moje dotychczasowe spięcie, które ściąga dane.

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)) 

Dzięki!

+1

Może nie dostać się pytanie, ale 'UPDATE ołów SET Pobrano = TRUE gdzie ((@DateTo jest nieważna i @DateFrom jest null) lub (stamptime MIĘDZY @DateTo I @DateFrom)) '?? – vulkanino

Odpowiedz

4

Kontynuując vulkanino wypowiedź odpowiedź, coś takiego:

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

można po prostu OUTPUT zaktualizowane wierszy;

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

To aktualizuje, a następnie zwraca zaktualizowane wiersze w pojedynczej instrukcji.

+1

+1 po prostu genialny! –

+0

Użyłem tego rozwiązania z DELETED. * (Zamiast INSERTED. *), Aby zwrócić wartości pól _orginal_, tj. Wartości przed zastosowaniem UPDATE. –

2

Najlepszym rozwiązaniem może być użycie instrukcji OUTPUT z AKTUALIZACJĄ.

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 
Powiązane problemy