2012-02-03 18 views
5

Dispongo de un procedimiento de selección de almacenamiento y estoy tratando de hacerlo para que los resultados que traiga también actualicen una columna llamada Downloaded y marquen esas filas como descargas.Seleccionar y actualizar en un procedimiento almacenado

Por ejemplo, abro 10 filas de esas 10 filas. También deseo actualizar la columna Downloaded a verdadero todo en el mismo procedimiento almacenado. es posible?

Esta es mi sp hasta el momento, extrae los datos.

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

¡Gracias!

+1

Tal vez no he tenido la pregunta, pero 'ACTUALIZACIÓN plomo SET Descargado = TRUE donde ((@DateTo es nula y @DateFrom es nulo) o (stamptime ENTRE @DateTo Y @DateFrom)) '¿?? – vulkanino

Respuesta

4

Continuando comentario respuesta de vulkanino, algo como esto:

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

puede simplemente OUTPUT las filas actualizadas;

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

Esto actualiza, a continuación, devuelve las filas actualizadas en una sola instrucción.

+1

+1 simplemente brillante! –

+0

Utilicé esta solución con DELETED. * (En lugar de INSERTED. *) Para devolver los valores del campo _orginal_, es decir, los valores anteriores a la aplicación de la ACTUALIZACIÓN. –

2

La mejor opción es utilizar una instrucción OUTPUT con la ACTUALIZACIÓN.

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 
Cuestiones relacionadas