2012-02-03 8 views
5

У меня есть выбранная хранимая процедура, и я пытаюсь сделать так, чтобы результаты ее сбрасывали, также обновляет столбец Downloaded и маркирует эти строки как загрузки.Выберите и обновите в одной хранимой процедуре

Например, я вытаскиваю 10 строк из этих 10 строк. Я также хочу обновить столбец Downloaded до значения true в той же хранимой процедуре. Это возможно?

Это мой sp до сих пор, он сбрасывает данные.

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

Спасибо!

+1

Может быть, я не понял вопрос, но 'UPDATE привести Загруженные = TRUE WHERE ((@DateTo равно нулю и @DateFrom IS NULL) или (stamptime МЕЖДУ @DateTo И @DateFrom)) '?? – vulkanino

ответ

4

Продолжая комментарий ответа vulkanino, в чем-то вроде этого:

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

Вы можете просто OUTPUT обновленные строки;

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

Это обновление, затем возвращает обновленные строки в одном выражении.

+1

+1 просто блестящий! –

+0

Я использовал это решение с помощью DELETED. * (Вместо INSERTED. *), Чтобы вернуть значения поля _orginal_, то есть значения, которые были применены к UPDATE. –

2

Лучше всего использовать оператор OUTPUT с 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