VIEW中的ORDER BY返回不同的结果SQL

use*_*878 4 sql sql-server-2000 view sql-order-by

这是我的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
Run Code Online (Sandbox Code Playgroud)

当我在服务器(Microsoft SQL Server标准版v.8.00.2055)x64上运行它时,我得到了我想要的正确顺序的结果.

但是当我在(Microsoft SQL Server标准版v.10.50.1702.0)x86上运行它时,我得不到相同的结果.我喜欢在运行VIEW时忽略ORDER BY语句.如果我只是运行SELECT语句,另一方面我会以正确的顺序获得正确的结果.两个服务器上的数据库完全相同,脚本也是如此.

请帮我!

Mar*_*ith 9

如果您需要ORDER BY的结果,你需要把ORDER BYSELECT从视图.

ORDER BY内部仅查看用于控制哪些TOP应用为[STD_USER].[Transexport]分支不是在对视图进行选择操作结果的最终顺序.

TOP 100%ORDER BY是有害的.有关此问题的更多解释.

编辑尽管最终的作用ORDER BY取决于它是否存在,但这很有意思View.当在SELECT视图之外运行时,它用于对整个结果进行排序,并且它在限制消失TOP的最终分支时起作用UNION.

编辑2这个奇怪的行为在最近的Connect Item的评论中讨论

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
Run Code Online (Sandbox Code Playgroud)

计划