2009-07-31 16 views
7

me gustaría ordenar las filas devueltas por una instrucción UPDATE, pero no hay forma directa de hacerlo de acuerdo con el msdn page for the OUTPUT Clause, que dice:¿Cómo se ordena el conjunto de resultados de una instrucción UPDATE que usa la cláusula OUTPUT?

SQL Server no garantiza el orden en que se procesan las filas y devuelto por declaraciones DML utilizando la cláusula OUTPUT.

Dado que no puedo simplemente colocar "ordenar por" en mi consulta original, mi próximo enfoque es simplemente colocar los resultados en una tabla temporal o tabla variable, y luego seleccionar y ordenar a partir de eso. Debería ser capaz de encontrar una solución usando tablas temporales, pero no creo que alguna vez haya usado una variable de tabla. ¿Hay alguna razón para preferir una sobre la otra en este contexto? ¿O hay una forma mejor de obtener resultados ordenados de una cláusula OUTPUT (es decir, sin usar una tabla temporal o variable de tabla)?

La plataforma de base de datos es SQL Server 2005.

Aquí está la búsqueda original; Quiero ordenar en el campo ReleaseDate.

Update dbo.WFItem 
Set ApprovedDate = getdate() 
Output inserted.WFItemID, inserted.Title, inserted.Teaser 
Where ApprovedDate is null 

La tabla que se ejecuta en contra tiene la siguiente apariencia:

CREATE TABLE [dbo].[WFItem](
    [WFItemID] [int] IDENTITY(1,1) NOT NULL, 
    [Title] [varchar](255) NULL, 
    [Teaser] [varchar](255) NULL, 
    [ReleaseDate] [datetime] NULL, 
    [ApprovedDate] [datetime] NULL, 
    [SentDate] [datetime] NULL, 
CONSTRAINT [PK_WFItem] PRIMARY KEY CLUSTERED 
(
    [WFItemID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
+0

+1 por cláusula OUTPUT –

Respuesta

5

supongo que su única opción sería convertir la cláusula OUTPUT en un OUTPUT INTO y almacenar los valores en un (memoria de temporal) tabla y ordenarlos allí, al seleccionar de la tabla temporal.

DECLARE @UpdateOutputTable TABLE 
     (WFItemID INT, Title VARCHAR(255), Teaser VARCHAR(255), ReleaseDate DATETIME) 

y luego cambiar su instrucción UPDATE a ser:

Update dbo.WFItem 
Set ApprovedDate = getdate() 
Output inserted.WFItemID, inserted.Title, inserted.Teaser, inserted.ReleaseDate 
    INTO @UpdateOutputTable 
Where ApprovedDate is null 

y luego seleccione de la tabla temporal:

SELECT WFItemID, Title, Teaser 
FROM @UpdateOutputTable 
ORDER BY ReleaseDate 

Marc

1

Puede resultados de salida en variable de tabla y luego seleccione de esa tabla los resultados en cualquier orden Aquí hay un ejemplo de t él mismo MSDN page que se hace referencia en su Q. pero Ordenado por que al final

DECLARE @MyTableVar table(
    EmpID int NOT NULL, 
    OldVacationHours int, 
    NewVacationHours int, 
    ModifiedDate datetime); 
UPDATE TOP (10) HumanResources.Employee 
SET VacationHours = VacationHours * 1.25 
OUTPUT INSERTED.EmployeeID, 
     DELETED.VacationHours, 
     INSERTED.VacationHours, 
     INSERTED.ModifiedDate 
INTO @MyTableVar; 
--Display the result set of the table variable. 
SELECT EmpID, OldVacationHours, NewVacationHours, ModifiedDate 
FROM @MyTableVar 
Order by EmpID; 
1

No hay manera de ordenar una salida, a lo mejor de mi conocimiento. En cuanto a qué objeto usar, realmente depende de los volúmenes de datos con los que se está tratando. He aquí un artículo comparando las tablas temporales de las variables de tabla:

http://blogs.msdn.com/sqlprogrammability/archive/2007/01/18/11-0-temporary-tables-table-variables-and-recompiles.aspx

sólo tiene que utilizar SALIDA EN dejar caer sus resultados en su objeto temporal, y luego traerlos de vuelta usando una cláusula ORDER BY.

Cuestiones relacionadas