2012-02-03 10 views
5

私は選択ストアドプロシージャを持っていますが、その結果をダウンさせる結果をもたらすようにしようとしています。Downloadedという列を更新し、1つのストアドプロシージャで選択して更新する

たとえば、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)) 

ありがとうございます! 、vulkaninoのコメント答えに、このような何か引き続き

+1

たぶん私は質問を得るが、= TRUE((@DateToがnullで、@DateFromがnullの場合)または@DateToと@DateFrom BETWEEN(stamptimeダウンロード 'UPDATEリードSETませんでした)) '?? – vulkanino

答えて

4

:あなたはOUTPUT単に更新された行を

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

をすることができます。

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

これは更新され、1つのステートメントで更新された行を返します。

+1

+1は単に華麗です! –

+0

私は、このソリューションをDELETED。*(INSERTED。*の代わりに)と併用して_ORGATEフィールド値、つまりUPDATEが適用される前の値を返しました。 –

2

あなたの最善の策は、UPDATEでOUTPUTステートメントを使用することです。

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 
関連する問題