简体   繁体   English

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

[英]ORDER BY in VIEW returns different results SQL

This is my viww: 这是我的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

When I run it on the server (Microsoft SQL Server Standard Edition v. 8.00.2055) x64 I get the result that I want in the right order. 当我在服务器(Microsoft SQL Server标准版v.8.00.2055)x64上运行它时,我得到了我想要的正确顺序的结果。

But when I run it on (Microsoft SQL Server Standard Edition v.10.50.1702.0) x86 I do not get the same result. 但是当我在(Microsoft SQL Server标准版v.10.50.1702.0)x86上运行它时,我得不到相同的结果。 It's likes it ignores the ORDER BY statement when I run the VIEW. 我喜欢在运行VIEW时忽略ORDER BY语句。 If I just run the SELECT statements I do on the other hand get the RIGHT result with the right order. 如果我只是运行SELECT语句,另一方面我会以正确的顺序获得正确的结果。 The databases are exactly the same and the scripts as well on both the servers. 两个服务器上的数据库完全相同,脚本也是如此。

Please help me! 请帮我!

If you need an ORDER BY for the results you need to put an ORDER BY in the SELECT from the view. 如果结果需要ORDER BY ,则需要在视图中的SELECT放置ORDER BY

The ORDER BY inside the View only serves to control what the TOP applies to for the [STD_USER].[Transexport] branch not for the eventual order of results in select operations against the view. View中的ORDER BY仅用于控制TOP应用于[STD_USER].[Transexport]分支的内容,而不是针对视图的select操作的最终结果顺序。

See TOP 100 Percent ORDER BY Considered Harmful. 见前100%ORDER BY认为有害。 for more explanation of this. 有关此问题的更多解释。

Edit It is quite interesting though that the role of the final ORDER BY changes depending upon whether it is in a View or not. 编辑虽然最终ORDER BY的角色根据它是否在View而改变,但这很有意思。 When the SELECT is run outside of a View it serves to order the entire results and it's role in limiting the TOP for the final branch of the UNION disappears. SELECT在View之外运行时,它用于对整个结果进行排序,并且它在限制UNION的最终分支的TOP的作用消失。

Edit 2 This odd behaviour is discussed in the comments of this recent Connect Item 编辑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

计划

I don't believe you are supposed to set an ORDER BY in the VIEW for ordering the data. 我不相信你应该在VIEW设置ORDER BY来订购数据。 A view outputs a set of data, which can then be queried. 视图输出一组数据,然后可以查询这些数据。

This should be done when querying the View. 这应该在查询视图时完成。

SELECT *
FROM [view_TransInvoice]
ORDER BY Customernr, Referensnr, a

Maybe you did not get the hotfix on one of the servers? 也许你没有在其中一台服务器上获得此修补程序?

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM