2009-07-31 10 views
7

mi piacerebbe ordinare le righe restituite da un'istruzione UPDATE, ma non c'è modo diretto per farlo secondo il msdn page for the OUTPUT Clause, che dice:Come ordinare il set di risultati di un'istruzione UPDATE che utilizza la clausola OUTPUT?

SQL Server non garantisce l'ordine in cui le righe vengono elaborate e restituito dalle dichiarazioni DML utilizzando la clausola OUTPUT.

Dal momento che non posso semplicemente virare "ORDER BY" sul mio query originale, il mio prossimo approccio è quello di mettere solo i risultati in una variabile di tabella o una tabella temporanea, quindi selezionare e ordinare da questo. Dovrei essere in grado di capire una soluzione usando tabelle temporanee, ma non credo di aver mai usato una variabile di tabella prima. C'è un motivo per preferire l'uno rispetto all'altro in questo contesto? O c'è un modo migliore per ottenere risultati ordinati da una clausola OUTPUT (cioè senza una tabella temporanea o una variabile di tabella)?

La piattaforma DB è SQL Server 2005.

Ecco la query originale; Voglio ordinare nel campo ReleaseDate.

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

La tabella si corre contro sembra qualcosa di simile:

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 per clausola OUTPUT –

risposta

5

Credo che l'unica opzione potrebbe essere quella di trasformare la clausola OUTPUT in un OUTPUT INTO e memorizzare i valori in un temporaneo (in memoria) tabella e ordinarli lì, quando si seleziona dalla tabella temporanea.

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

e quindi modificare l'istruzione UPDATE per essere:

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

e quindi selezionare dalla tabella temporanea:

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

Marc

1

Puoi risultati di output in variabile di tabella e quindi selezionare da quella tabella i risultati in qualsiasi ordine Ecco un esempio da t egli stesso MSDN page che lei ha fatto riferimento al vostro D. Ma io inserimento Ordina per, alla fine

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

Non v'è alcun modo per ordinare un'uscita, al meglio delle mie conoscenze. Per quanto riguarda l'oggetto da utilizzare, in realtà dipende dai volumi di dati con cui hai a che fare. Ecco un articolo confrontando le tabelle temporanee per le variabili di tabella:

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

Basta utilizzare l'output INTO per rilasciare i risultati nel vostro oggetto temporaneo, poi a prenderli indietro utilizzando una clausola ORDER BY.

Problemi correlati