Как отсортировать результирующий набор оператора UPDATE, который использует предложение OUTPUT? - PullRequest
9 голосов
/ 31 июля 2009

Я бы хотел отсортировать строки, возвращаемые оператором UPDATE, но прямого способа сделать это в соответствии со страницей msdn для предложения OUTPUT , которая гласит:

SQL Server не гарантирует порядок, в котором строки обрабатываются и возвращаются операторами DML с использованием предложения OUTPUT.

Поскольку я не могу просто прикрепить "order by" к своему исходному запросу, мой следующий подход - просто поместить результаты во временную таблицу или переменную таблицы, а затем выбрать и упорядочить из этого. Я должен быть в состоянии найти решение, используя временные таблицы, но я не думаю, что когда-либо использовал переменную таблицы раньше. Есть ли причина в этом контексте отдавать предпочтение одному другому? Или есть лучший способ получить отсортированные результаты из предложения OUTPUT (т.е. без использования временной таблицы или табличной переменной)?

Платформой БД является SQL Server 2005.

Вот оригинальный запрос; Я хочу отсортировать по полю ReleaseDate.

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

Таблица, с которой он работает, выглядит примерно так:

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]

Ответы [ 3 ]

6 голосов
/ 31 июля 2009

Полагаю, единственным вариантом было бы превратить предложение OUTPUT в OUTPUT INTO, сохранить значения во временной таблице (в памяти) и отсортировать их там при выборе из временной таблицы.

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 голос
/ 31 июля 2009

Насколько мне известно, нет способа отсортировать ВЫХОД. Что касается того, какой объект использовать, это действительно зависит от объемов данных, с которыми вы имеете дело. Вот статья, сравнивающая временные таблицы с табличными переменными:

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

Просто используйте OUTPUT INTO, чтобы поместить ваши результаты во временный объект, а затем получить их обратно с помощью предложения ORDER BY.

1 голос
/ 31 июля 2009

Вы можете вывести результаты в табличную переменную, а затем выбрать из этой таблицы результаты в любом порядке. Вот пример из той же страницы MSDN , на которую вы ссылались в своей Q., но в конце я добавил Order By

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...