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语句,另一方面我会以正确的顺序获得正确的结果.两个服务器上的数据库完全相同,脚本也是如此.
请帮我!
如果您需要ORDER BY的结果,你需要把ORDER BY在SELECT从视图.
该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)
