Benutzer mit den meisten Antworten
ORDER BY Klausel in einer VIEW

Frage
-
Hallo,
ich bin Datenbankadministrator. Die Entwickler kamen gerade zu mir. Sie haben ein Problem beim Sortieren in einer VIEW unter SQLSERVER 2005 SP3 64-bit.
Er sortiert einfach nicht.
Folgenden Artikel habe ich schon gelesen: http://support.microsoft.com/kb/926292
Leider wird der genannte Hotfix nur für SP2 angeboten und ich glaube nur für 32-bit?!
Somit kann ich es nicht ausführen.
Wie habt ihr das Problem gelöst bzw. könnt ihr uns helfen?
Danke.
Antworten
-
Hallo, danke für deine Antwort.
Sorry, leider wieder ich... :-)
Doch wie ich schon sagte, es lässt sich nicht überall anwenden, denn viele Applikationen in der Firma wurden von anderen Firmen entwickelt. Sodass wir hier nicht den Code ändern können. Zumal wäre es ein arg großer Aufwand und Datenabnkbelastung wenn wir das bei jeder Abfrage so handhaben müssten.
Irgendwie muss es doch eine Lösung geben, denn im SQL Server 2000 hat es ja funktioniert, nun wurde auf 2005 migiert und jetzt geht es nicht mehr.
Hoffe noch auf andere Antworten, danke.
Falsch! Es hat nie funktioniert! Zumindest nicht garantiert und dokumentiert. Es war mehr oder weniger nur Zufall, dass die Ergebnismenge eines Views auch im äusseren SELECT sortiert war aufgrund des intern verwendeten Algorithmus. Ihr (und viele andere) habt Euch da auf ein undokumentiertes Feature veranlassen und dieses kommt nun zurück und beisst Euch.
Der Hotfix, den Du erwähnt hast, gibt Dir auch nur eine unbestimmte Zeit Aufschub. Es wird so oder so also sowohl an den internen wie auch externen Applikationen geändert werden müssen. Natürlich verursacht das Aufwand. Natürlich ist das ärgerlich. Aber was wäre die Alternative? Bis zum Sankt Nimmerleins Tag auf SQL Server 2000 zu bleiben? Oder höhere SQL Server Versionen in einem Limbo Kompatibilitätsmodus zu fahren?
-- Frank Kalis Microsoft SQL Server MVP Webmaster: http://www.insidesql.org- Als Antwort vorgeschlagen Robert BreitenhoferModerator Sonntag, 25. Oktober 2009 14:55
- Als Antwort markiert Robert BreitenhoferModerator Sonntag, 1. November 2009 14:46
-
Hallo ChrisSasse,
zum einem kann ich mich Frank nur anschliessen. Es macht keinen Sinn, in einem View eine Sortierung vorzugeben, deswegen funktioniert es auch nicht.
Wie die Daten zu sortieren sind, das endscheidet der Aufrufer der View. Und wenn es im View eine (funktionsfähige) Sortierung gäbe, müssten die Daten eigentlich erst nach der sortiert und anschließend noch mal nach der Vorgabe des Aufrufers umsortiert werden; das wäre doppelter Aufwand.
Dann habe ich den Eindruck, das Du den Lösungsvorschlag von Frank nicht ganz verstanden hast. Dieses Sql Statement soll nicht in die Applikationen eingebaut werden, sondern die vorhandenenen Views, an die doch wohl dran kommst, sollen nach dem Schema umgeändert werden, wobei sich die Änderung auf die Angabe des TOP geschränkt.
Aber Du solltest Dir bewusst sein, das bei Views die viele Datensätze liefern, durch TOP 99.99 PERCENT auch welche weg fallen.
Nimm mal folgendes Statement; das sortiert soweit richtig; mach aus 99.99 einmal 100 und schon ist die Sortierung wieder weg.
USE [AdventureWorks]
GO
CREATE VIEW dbo.vwSortedAddresses
AS
SELECT TOP 99.99999999 PERCENT
RIGHT(AddressLine1, 5) AS OrderPart
,*
FROM Person.Address
ORDER BY RIGHT(AddressLine1, 5) DESC
GO
SELECT *
FROM dbo.vwSortedAddresses
Olaf Helper ----------- * cogito ergo sum * errare humanum est * quote erat demonstrandum * Wenn ich denke, ist das ein Fehler und das beweise ich täglich http://olafhelper.over-blog.de- Als Antwort vorgeschlagen Robert BreitenhoferModerator Sonntag, 25. Oktober 2009 14:55
- Als Antwort markiert Robert BreitenhoferModerator Sonntag, 1. November 2009 14:46
Alle Antworten
-
Hallo,
ich bin Datenbankadministrator. Die Entwickler kamen gerade zu mir. Sie haben ein Problem beim Sortieren in einer VIEW unter SQLSERVER 2005 SP3 64-bit.
Er sortiert einfach nicht.
Folgenden Artikel habe ich schon gelesen: http://support.microsoft.com/kb/926292
Leider wird der genannte Hotfix nur für SP2 angeboten und ich glaube nur für 32-bit?!
Somit kann ich es nicht ausführen.
Wie habt ihr das Problem gelöst bzw. könnt ihr uns helfen?
Danke.
Was spricht dagegen, die Entwickler höflich, aber bestimmt zu ermuntern, das ORDER BY dort zu verwenden, wo es hingehört? Ins SELECT welches den View abfragt? Das wird über kurz oder lang sowieso erfolgen müssen. :-)
-- Frank Kalis Microsoft SQL Server MVP Webmaster: http://www.insidesql.org -
Hallo,
Die Entwickler benutzen ja das ORDER by bei Abfragen in einer VIEW, aber es nicht alle Applikationen von usneren Entwicklern gemacht sodass bei den anderen Applikationn es genauso ist die das ORDER BY benutzen.
Trotzdem danke für deine antwort.- Als Antwort vorgeschlagen Frank Kalis Montag, 19. Oktober 2009 14:20
- Nicht als Antwort vorgeschlagen Robert BreitenhoferModerator Sonntag, 25. Oktober 2009 14:53
-
Hm, irgendwie habe ich gerade wohl auf den falschen Button geklickt...
Egal, schon klar, dass Dir meine antowrt momentan nicht wirklich weiterhilft, aber letztendlich ist das der richtige Weg. Alle Workarounds können schon mit dem nächsten Hotfix oder Service Pack nicht mehr funktionieren.
Einer dieser Workarounds, der häufig im Internet anzutreffen ist, ist folgender:
SELECT SERVERPROPERTY('ProductLevel'), SERVERPROPERTY('ProductVersion'); GO CREATE TABLE dbo.t1 ( c1 int, c2 int); GO CREATE VIEW dbo.v1 AS SELECT TOP 99.99 PERCENT c1,c2 FROM dbo.t1 ORDER BY c2; GO INSERT INTO dbo.t1 (c1,c2) VALUES (1,3); INSERT INTO dbo.t1 (c1,c2) VALUES (2,2); INSERT INTO dbo.t1 (c1,c2) VALUES (3,1); GO SELECT c1, c2 FROM dbo.v1; DROP VIEW dbo.v1 DROP TABLE dbo.t1 SP3 9.00.4035.00 3 1 2 2 1 3 (3 row(s) affected)
Der Server ist ebenfalls SQL Server 2005 SP 3 64-bit. Aber, wie gesagt, keine Garantie, dass dies immer und überall funktioniert.
-- Frank Kalis Microsoft SQL Server MVP Webmaster: http://www.insidesql.org -
Hallo, danke für deine Antwort.
Doch wie ich schon sagte, es lässt sich nicht überall anwenden, denn viele Applikationen in der Firma wurden von anderen Firmen entwickelt. Sodass wir hier nicht den Code ändern können. Zumal wäre es ein arg großer Aufwand und Datenabnkbelastung wenn wir das bei jeder Abfrage so handhaben müssten.
Irgendwie muss es doch eine Lösung geben, denn im SQL Server 2000 hat es ja funktioniert, nun wurde auf 2005 migiert und jetzt geht es nicht mehr.
Hoffe noch auf andere Antworten, danke. -
Hallo, danke für deine Antwort.
Sorry, leider wieder ich... :-)
Doch wie ich schon sagte, es lässt sich nicht überall anwenden, denn viele Applikationen in der Firma wurden von anderen Firmen entwickelt. Sodass wir hier nicht den Code ändern können. Zumal wäre es ein arg großer Aufwand und Datenabnkbelastung wenn wir das bei jeder Abfrage so handhaben müssten.
Irgendwie muss es doch eine Lösung geben, denn im SQL Server 2000 hat es ja funktioniert, nun wurde auf 2005 migiert und jetzt geht es nicht mehr.
Hoffe noch auf andere Antworten, danke.
Falsch! Es hat nie funktioniert! Zumindest nicht garantiert und dokumentiert. Es war mehr oder weniger nur Zufall, dass die Ergebnismenge eines Views auch im äusseren SELECT sortiert war aufgrund des intern verwendeten Algorithmus. Ihr (und viele andere) habt Euch da auf ein undokumentiertes Feature veranlassen und dieses kommt nun zurück und beisst Euch.
Der Hotfix, den Du erwähnt hast, gibt Dir auch nur eine unbestimmte Zeit Aufschub. Es wird so oder so also sowohl an den internen wie auch externen Applikationen geändert werden müssen. Natürlich verursacht das Aufwand. Natürlich ist das ärgerlich. Aber was wäre die Alternative? Bis zum Sankt Nimmerleins Tag auf SQL Server 2000 zu bleiben? Oder höhere SQL Server Versionen in einem Limbo Kompatibilitätsmodus zu fahren?
-- Frank Kalis Microsoft SQL Server MVP Webmaster: http://www.insidesql.org- Als Antwort vorgeschlagen Robert BreitenhoferModerator Sonntag, 25. Oktober 2009 14:55
- Als Antwort markiert Robert BreitenhoferModerator Sonntag, 1. November 2009 14:46
-
Hallo ChrisSasse,
zum einem kann ich mich Frank nur anschliessen. Es macht keinen Sinn, in einem View eine Sortierung vorzugeben, deswegen funktioniert es auch nicht.
Wie die Daten zu sortieren sind, das endscheidet der Aufrufer der View. Und wenn es im View eine (funktionsfähige) Sortierung gäbe, müssten die Daten eigentlich erst nach der sortiert und anschließend noch mal nach der Vorgabe des Aufrufers umsortiert werden; das wäre doppelter Aufwand.
Dann habe ich den Eindruck, das Du den Lösungsvorschlag von Frank nicht ganz verstanden hast. Dieses Sql Statement soll nicht in die Applikationen eingebaut werden, sondern die vorhandenenen Views, an die doch wohl dran kommst, sollen nach dem Schema umgeändert werden, wobei sich die Änderung auf die Angabe des TOP geschränkt.
Aber Du solltest Dir bewusst sein, das bei Views die viele Datensätze liefern, durch TOP 99.99 PERCENT auch welche weg fallen.
Nimm mal folgendes Statement; das sortiert soweit richtig; mach aus 99.99 einmal 100 und schon ist die Sortierung wieder weg.
USE [AdventureWorks]
GO
CREATE VIEW dbo.vwSortedAddresses
AS
SELECT TOP 99.99999999 PERCENT
RIGHT(AddressLine1, 5) AS OrderPart
,*
FROM Person.Address
ORDER BY RIGHT(AddressLine1, 5) DESC
GO
SELECT *
FROM dbo.vwSortedAddresses
Olaf Helper ----------- * cogito ergo sum * errare humanum est * quote erat demonstrandum * Wenn ich denke, ist das ein Fehler und das beweise ich täglich http://olafhelper.over-blog.de- Als Antwort vorgeschlagen Robert BreitenhoferModerator Sonntag, 25. Oktober 2009 14:55
- Als Antwort markiert Robert BreitenhoferModerator Sonntag, 1. November 2009 14:46