ORDER BY в VIEW возвращает разные результаты SQL - PullRequest
4 голосов
/ 25 ноября 2011

Это мой viww:

CREATE VIEW [STD_USER].[view_TransInvoice]
AS

SELECT TOP 999999 Customernr, Referensnr,'2' as a, InvoiceRowData, FileHead
    FROM [STD_USER].[Transexport]
    WHERE InvoiceRowData IS NOT NULL
    UNION 
SELECT TOP 999999 Customernr, Referensnr,'1' AS a , InvoiceHead , FileHead
    FROM [STD_USER].[Transexport]
    WHERE InvoiceHead IS NOT NULL
    UNION 
SELECT TOP 999999 Customernr, Referensnr,'3' AS a , InvoiceFoot , FileHead 
    from [STD_USER].[Transexport]
    WHERE InvoiceFoot IS NOT NULL
    ORDER BY Customernr, Referensnr, 3

Когда я запускаю его на сервере (Microsoft SQL Server Standard Edition v. 8.00.2055) x64, я получаю нужный результат в правильном порядке.

Но когда я запускаю его (Microsoft SQL Server Standard Edition v.10.50.1702.0) x86, я не получаю тот же результат. Это похоже на игнорирование оператора ORDER BY при запуске VIEW. Если я просто запускаю операторы SELECT, то с другой стороны получаю ПРАВИЛЬНЫЙ результат в правильном порядке. Базы данных точно такие же, как и сценарии на обоих серверах.

Пожалуйста, помогите мне!

Ответы [ 3 ]

9 голосов
/ 25 ноября 2011

Если вам нужен ORDER BY для результатов, вам нужно поставить ORDER BY в SELECT на виде.

ORDER BY внутри представления служит только для управления тем, к чему применяется TOP для ветви [STD_USER].[Transexport], а не для конечного порядка результатов в операциях выбора с представлением.

См. TOP 100 процентов ORDER BY считается вредным. для более подробного объяснения этого.

Редактировать Интересно, что роль финала ORDER BY меняется в зависимости от того, находится он в View или нет. Когда SELECT запускается вне представления, он служит для упорядочивания всех результатов, и его роль в ограничении TOP для конечной ветви UNION исчезает.

Редактировать 2 Это странное поведение обсуждается в комментариях этого недавнего элемента подключения

CREATE TABLE A (C VARCHAR(100))
CREATE TABLE B (C VARCHAR(100))


SELECT TOP 1000 C 
FROM A
UNION ALL
SELECT TOP 1000 C
FROM B
ORDER BY C

GO

CREATE VIEW V
AS
SELECT TOP 1000 C 
FROM A
UNION ALL
SELECT TOP 1000 C
FROM B
ORDER BY C

GO

SELECT *
FROM V

GO

DROP TABLE A
DROP TABLE B
DROP VIEW V

Plan

1 голос
/ 25 ноября 2011

Я не верю, что вы должны установить ORDER BY в VIEW для упорядочения данных.Представление выводит набор данных, которые затем могут быть запрошены.

Это должно быть сделано при запросе представления.

SELECT *
FROM [view_TransInvoice]
ORDER BY Customernr, Referensnr, a
0 голосов
/ 25 ноября 2011

Может быть, вы не получили исправление на одном из серверов?

http://support.microsoft.com/kb/926292

...