2009-07-31 6 views
7

言うこれ、私はUPDATE文によって返された行をソートしたいのですが、msdn page for the OUTPUT Clauseに応じてこれを実行する直接的な方法はありません。OUTPUT句を使用するUPDATE文の結果セットをソートする方法は?

SQL Serverが行が処理される順序を保証するものではありません。 OUTPUT句を使用してDML文によって戻されます。

元のクエリに「順序付け」するだけで済むわけではないので、次のアプローチは結果を一時テーブルまたはテーブル変数に入れてから選択して並べ替えることです。私は一時テーブルを使って解決策を見つけ出すことができるはずですが、以前はテーブル変数を使用したことはないと思います。この文脈で他のものを優先して選ぶ理由はありますか?または、OUTPUT句(つまり、一時表または表変数を使用してw/out)からソートされた結果を取得するには、より良い方法がありますか?

DBプラットフォームは、SQL Server 2005の

ここでは、元のクエリがありますです。私はReleaseDateフィールドを並べ替える必要があります。私はあなたの唯一のオプションはOUTPUT INTOOUTPUT句を回すと、インメモリ(一時的に値を格納するだろうと思い

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 OUTPUT句 –

答えて

5

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

それはに対して実行表は次のようになります)テーブルを作成し、一時テーブルから選択するときに並べ替えます。

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

、その後はであるためにあなたのUPDATEステートメントを変更します。

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

、その後、一時テーブルから選択します。

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

マルク・

1

することはできテーブル変数への出力結果その表から任意の順序で結果を選択してください これはtの例です彼と同じMSDN pageあなたQ.で言及したが、私は私の知る限り、出力をソートする方法はありません最後

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

に秩序を追加しました。どのオブジェクトを使用するかは、扱っているデータ量に大きく依存します。ここでは、テーブル変数に一時テーブルを比較した記事です:

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

ちょうどそのORDER BY句を使用してそれらをバックフェッチ、あなたの一時的なオブジェクトにあなたの結果をドロップするOUTPUT INTOを使用します。

関連する問題