这是我的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标准版v.8.00.2055)x64时,我得到了我想要的结果。
但是当我在(Microsoft SQL Server标准版v.10.50.1702.0)x86上运行它时,我得不到相同的结果。我喜欢在运行VIEW时忽略ORDER BY语句。如果我只是运行SELECT语句,另一方面我会以正确的顺序获得正确的结果。 两个服务器上的数据库完全相同,脚本也是如此。
请帮助我!
答案 0 :(得分:9)
如果您需要ORDER BY
的结果,则需要在视图中的ORDER BY
中添加SELECT
。
视图中的ORDER BY
仅用于控制TOP
适用于[STD_USER].[Transexport]
分支的内容,而不是针对视图的选择操作中的最终结果顺序。
有关详细说明,请参阅TOP 100 Percent ORDER BY Considered Harmful.。
编辑虽然最终ORDER BY
的作用会根据是否在View
中而有所改变,但这很有意思。当SELECT
在视图之外运行时,它用于对整个结果进行排序,并且它在限制TOP
的最终分支UNION
的作用中消失。
编辑2 this recent 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
答案 1 :(得分:1)
我不相信您应该在ORDER BY
中设置VIEW
来排序数据。视图输出一组数据,然后可以查询。
查询视图时应该这样做。
SELECT *
FROM [view_TransInvoice]
ORDER BY Customernr, Referensnr, a
答案 2 :(得分:0)
也许你没有在其中一台服务器上获得此修补程序?