2009-07-31 22 views
7

Chciałbym sortować wierszy zwracanych przez instrukcję UPDATE, ale nie ma bezpośredni sposób to zrobić zgodnie z msdn page for the OUTPUT Clause, który mówi:Jak posortować zestaw wyników instrukcji UPDATE, która używa klauzuli OUTPUT?

SQL Server nie gwarantuje kolejności, w której wiersze są przetwarzane i zwracane przez instrukcje DML przy użyciu klauzuli OUTPUT.

Ponieważ nie mogę po prostu przysłać "zamówienie" na moje pierwotne zapytanie, moim następnym podejściem jest po prostu umieszczenie wyników w tymczasowej tabeli lub zmiennej tabeli, a następnie wybór i zamówienie z tego. Powinienem być w stanie znaleźć rozwiązanie przy użyciu tabel tymczasowych, ale nie sądzę, abym kiedykolwiek wcześniej używał zmiennej tabeli. Czy istnieje powód, aby preferować jeden w stosunku do drugiego w tym kontekście? Czy istnieje lepszy sposób, aby uzyskać posortowane wyniki z klauzuli OUTPUT (tj. W/out przy użyciu zmiennej tabeli lub zmiennej tabeli)?

Platforma DB jest SQL Server 2005.

Oto oryginalne zapytanie; Chcę sortować w polu ReleaseDate.

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

tabela działa przeciwko wygląda mniej więcej tak:

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 dla klauzuli OUTPUT –

Odpowiedz

5

Chyba jedyną opcją byłoby włączyć klauzulę OUTPUT się z OUTPUT INTO i przechowywania wartości w tymczasowym (in-memory) i posortuj je tam, wybierając z tabeli tymczasowej.

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

a następnie zmienić swoje oświadczenie UPDATE być:

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

a następnie wybierz z tabeli tymczasowej:

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

Marc

1

Można Wyniki wyjście do zmiennej tabeli a następnie wybierz z tej tabeli wyniki w dowolnej kolejności Oto przykład z t on sam MSDN page że, o których mowa w Q. ale dodania Uporządkuj wg w końcu

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

Nie ma sposobu, aby rozwiązać wyjście, aby zgodnie z moją najlepszą wiedzą. Co do tego, którego obiektu użyć, zależy to od ilości danych, z którymi masz do czynienia. Oto artykuł porównanie tabel tymczasowych do zmiennych tabeli:

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

Wystarczy użyć wyjście do upuścić swoje wyniki do swojego tymczasowego obiektu, a następnie sprowadzić je z powrotem za pomocą klauzuli ORDER BY.

Powiązane problemy