none
Datentabelle: Sortierung permanent machen via SSMS RRS feed

  • Frage

  • Hi,

    bei der Einabe von Daten mittels SSMS erhält man öfters unsortierte Datensätze.
    Mit Select...From... Order by  kann man ja die Tabelle sortieren, aber nur temporär für die Ansicht.

    Wie ist es möglich, eine Sortierung sozusagen permanent zu machen, d.h., die sortierte Version speichern?

    Grüße-


    Dietrich

    Samstag, 5. März 2016 14:26

Antworten

  • Mal zum Hintergrund:

    Relationale Datenbanken kennen arbeiten unabhängig von einer „Reihenfolge der Speicherung“. MySQL ist da eine Ausnahme - weil es eigentlich ein „Dateiverwaltungssystem“ ist kann es die „Reihenfolge“ der Zeilen in der Datei beachten. Deswegen ist MySQL auch nicht in jeder Statistik ein RDBMS.

    SQL Server ist aber eines, und kann daher Daten nur für die sogenannte Präsentationsschicht garantiert sortiert zurückgeben. Alles VOR der Präsentationsschicht obliegt der Query Engine bzw der Storage Engine zu entscheiden, wie sie die Daten heranholt.

    Das ORDER BY gehört zur Präsentationsschicht – und vor 2005 war es im Prinzip ein Bug, mit wem man die Engine überlisten konnte, indem man das ORDER BY in eine Sicht integrierte. Mit 2005 wurde das dem ANSI-Standard angepasst

    Je nachdem, was man eigentlich erreichen möchte, kann man mit Prozeduren arbeiten (dort ist ORDER BY erlaubt) oder mit ROW_NUMBER arbeiten. – Nichts aber garantiert, dass bei einem 2. Aufruf nicht plötzlich Daten an einer Position im Resultset auftauchen, die dort vorher nicht waren. Der Key ist eben die „ORDER BY“-Klausel (auch bei ROW_NUMBER)


    Andreas Wolter (Blog | Twitter)
    MCSM: Microsoft Certified Solutions Master Data Platform/SQL Server 2012
    MCM SQL Server 2008
    MVP Data Platform
    www.SarpedonQualityLab.com | www.andreas-wolter.com

    Montag, 7. März 2016 09:06
  • Ich habe auch noch ein bisschen rumgesucht im Netz und kann sein, dass die auf diesem Link

    http://stackoverflow.com/questions/6694430/create-table-from-view

    gezeigten Ideen eine recht schnelle Lösung sind...

    Hallo Dietrich,

    eine rechte schnelle Lösung für was? Wenn Du eine Tabelle ohne jeglichen (Primär- und Fremd)Schlüssel, Index, Einschränkung, Trigger, usw. usw. mit einem Spaltenaufbau, der dem der View entspricht, haben willst, ja, dann kann das eine schnelle Lösung sein.

    Für alles andere, vor allen Dingen dein Sortier"problem" (welches aber nur für dich ein Problem ist): Nö :)


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Montag, 7. März 2016 08:54
    Moderator
  • Du kannst die Daten nicht so sortiert speichern, selbst wenn die Daten in der richtigen Reihenfolge gespeichert wären garantiert es dir nicht, dass auch die Ausgabe so sortiert ist. So arbeiten Datenbanksysteme nun mal nicht. 

    Wenn du zum Beispiel auf der Tabelle einen Clustered Index hast, dann ist dem SQL Server egal in welcher Reihenfolge du die Daten speicherst. Die Reihenfolge wird dann nur durch die Index Spalte bestimmt. Und obwohl hier eine physische Sortierung der Tabelle vorliegt muss dies für die Ausgabe nicht so sein.


    Benjamin Hoch
    MCSE: Data Platform
    MCSA: Windows Server 2012
    Blog

    Montag, 7. März 2016 10:34

Alle Antworten

  • Hallo Dietrich,

    Wie ist es möglich, eine Sortierung sozusagen permanent zu machen, d.h., die sortierte Version speichern?

    gar nicht. Und das würde auch keinen Sinn machen. Wenn Du nicht immer ORDER BY ... selbst angeben willst, erstell dir eine View, die das für dich macht und frag die dann ab.

    CREATE VIEW qrySortiertNachIrgendwas
    AS
    SELECT   TOP 100 PERCENT
             Spalte1,
             Spalte2,
             ...
    FROM     Tabelle
    ORDER BY SpalteX,
             SpalteY DESC
    

    Ansonsten leg ein neues Feld in der Tabelle an und schreib dort die Sortierposition rein, dann musst Du eben nach dieser Spalte sortieren.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort vorgeschlagen Benjamin.Hoch Samstag, 5. März 2016 15:31
    • Nicht als Antwort vorgeschlagen dherrmann Samstag, 5. März 2016 15:36
    Samstag, 5. März 2016 14:34
    Moderator
  • Hallo Dietrich,

    man kann für die Tabelle einen Clustered Index erstellen. Damit legt man die physische Sortierung der Daten in der Tabelle fest. Aber auch dies garantiert nicht, dass die Daten auch in dieser Reihenfolge ausgegeben werden. 

    Gruß Benjamin


    Benjamin Hoch
    MCSE: Data Platform
    MCSA: Windows Server 2012
    Blog

    Samstag, 5. März 2016 15:31
  • Hi Stefan,

    nun, ich sehe das nicht so, dass es "keinen Sinn" machen würde - aber: "Meinungsfreiheit" :-)

    Das mit dem View ist die einfachste Lösung, klar, aber das wusste ich natürlich, denn ich habe schon hunderte Views definiert. :-)

    Und ich habe in meiner Tabelle eine "Sortierspalt (Nummerierung) drin, nach der ich eben permanent eine Sortierung vorhnehmen wollte...

    Ich hatte gesehen, dass bei der Tabellendefinition bei den Spalteneigenschaften es auch eine Eigenschaft "Sortierung" gibt, die ich noch nie benutzt habe. Allerdings ist die Eigenschaft selbst bei einer Integer-Spalte (meine Nummerierung) nicht verfügbar. Wann ist diese Eigenschaft verfügbar und sinnvoll anzuwenden?

    Grüße-


    Dietrich

    Samstag, 5. März 2016 15:36
  • Die deutsche Übersetzung Sortierung ist hier leider etwas irreführend. Hierbei handelt es sich um die Collation welche festlegt ob der SQL Server zum Beispiel Groß/kleinschreibung unterscheidet und die Reihenfolge für ein Order By. Als Beispiel wäre hier ob "TEST" gleich "test" oder nicht. 

    https://msdn.microsoft.com/de-de/library/ms184391(v=sql.120).aspx

    Gerade bei Integer ist die Funktion nicht nötig das die Sortierung ja mathematisch definiert ist.

    Datenbanken arbeiten Mengenorientiert, es spielt mathematisch keine Rolle ob die Zeilen in einer bestimmten Reihenfolge sind nur der Nutzer stört sich hier.

    Gruß Benjamin


    Benjamin Hoch
    MCSE: Data Platform
    MCSA: Windows Server 2012
    Blog

    Samstag, 5. März 2016 15:51
  • Danke Benjamin, für die beiden Antworten!

    Da muss ich wohl damit leben, dass SSMS das nicht leisten kann... ;-)

    Vielleicht schreibe ich mal ein kleines Programm mit Input unsortierte Tabelle und Output neuer SQL-Tabelle sortiert wie gewünscht. Ja, ich weiß, macht wohl nur Sinn für relativ kleine Tabellen...

    Grüße-


    Dietrich

    Samstag, 5. März 2016 16:00
  • Dann markiere doch bitte die Posts von Stefan und mir als Antwort damit die Frage abgeschlossen ist.

    Gruß Benjamin


    Benjamin Hoch
    MCSE: Data Platform
    MCSA: Windows Server 2012
    Blog

    Samstag, 5. März 2016 16:14
  • Hallo Dietrich,

    das SSMS hat damit nichts zu tun. Wenn Du keine ORDER BY Klausel angibst, kommen die Daten "willkürlich" zurück, egal über welchen Weg man den SQL Server anspricht.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Samstag, 5. März 2016 18:02
    Moderator
  • An Microsoft Developer:

    Nun, wäre es vielleicht nicht eine Idee, das SSMS zukünftig dahingehend mit einer entsprechenden Option zu erweitern?

    Grüße-


    Dietrich

    Samstag, 5. März 2016 22:27
  • Sortier Operationen gehören mit zu den aufwendigsten Operationen welche man auf Mengen machen kann.

    Der SQL Server bietet doch schon die Möglichkeit die Daten sortiert an eine Applikation zu liefern (auch SSMS). Die Option nennt sich View. Wer die Daten immer sortiert haben will fragt einfach die View ab anstatt die entsprechende Tabelle. Ziel erreicht.

    Wenn du diese Funktion quasi als Schalter haben willst müsstest du für jede Tabelle definieren nach welchen Spalten in welcher Reihenfolge sortiert werden soll. 

    Du kannst aber gerne einen Feature Request an Microsoft stellen und die Funktion einbauen zu lassen.

    http://connect.microsoft.com/

    Der SQL Server ist dafür ausgelegt Abfragen für tauschende von Nutzern, auf tauschenden von Tabellen mit Millionen von Daten schnell zu arbeiten. Hier eine Sortierung zu finden die immer richtig ist halt ich für unwahrscheinlich.

    Gruß Benjamin


    Benjamin Hoch
    MCSE: Data Platform
    MCSA: Windows Server 2012
    Blog

    Sonntag, 6. März 2016 06:38
  • Nun, wäre es vielleicht nicht eine Idee, das SSMS zukünftig dahingehend mit einer entsprechenden Option zu erweitern?

    Wie schon gesagt: Meiner Meinung nach ist das ein Feature, das nicht benötigt wird. Probieren kannst Du es natürlich, interessieren würde mich dann, wie viel Zuspruch das findet. Aber ich würde jetzt einfach mal sagen, dass der verschwindend gering sein dürfte.

    Zudem ist, wie ebenfalls schon gesagt, nicht das SSMS die Ursache, sondern die Datenbankengine an sich. Daher bringt es nichts, sowas ins SSMS zu integrieren.

    Wenn Du eine Arbeitserleichterung willst, erstell dir eine Vorlage oder einen Codeausschnitt im SSMS. Damit kannst Du SQL Statements vorbereiten, die Du dann im Abfrage Editor übernehmen kannst.

    Ein Beispiel für einen Codeausschnitt wäre bspw.:

    <?xml version="1.0" encoding="utf-8"?>
    <CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
        <_locDefinition xmlns="urn:locstudio">
            <_locDefault _loc="locNone"/>
            <_locTag _loc="locData">Title</_locTag>
            <_locTag _loc="locData">Description</_locTag>
            <_locTag _loc="locData">Author</_locTag>
            <_locTag _loc="locData">ToolTip</_locTag>
        </_locDefinition>
    	<CodeSnippet Format="1.0.0">
    		<Header>
    			<Title>Order By</Title>
                <Shortcut></Shortcut>
    			<Description>Codeausschnitt für ORDER BY Klausel</Description>
    			<Author>Stefan Falz</Author>
    			<SnippetTypes>
                    <SnippetType>Expansion</SnippetType>
    			</SnippetTypes>
    		</Header>
    		<Snippet>
    			<Declarations></Declarations>
    			<Code Language="SQL"><![CDATA[SELECT * FROM Tabelle ORDER BY 1]]></Code>
    		</Snippet>
    	</CodeSnippet>
    </CodeSnippets>
    

    Den Inhalt kannst Du bspw. in:

      C:\Users\<Benutzername>\Documents\SQL Server Management Studio\Code Snippets\SQL\My Code Snippets

    als "Order By.snippet" ablegen. Wenn Du das SSMS das nächste mal öffnest und im Abfrage Editor bist, drück mal Strg + K + X, wähle "My Code Snippets" und dann den gewünschten Codeausschnitt.

    Letztendlich können die Snnippets in jedem Ordner abgelegt werden. Falls Du es einfacher haben willst, nenn den Ordner bspw. "A_MySnippets", damit er in der Ordnerliste als erstes Element erscheint. In dem Fall dann einfach Strg + K + X, Tab, Tab, fertig.

    Weitere Infos zu Codeausschnitten und Vorlagen findest Du hier:

      https://technet.microsoft.com/de-de/magazine/jj554304.aspx

      http://blog.sqlauthority.com/2012/06/25/sql-server-template-browser-a-very-important-and-useful-feature-of-ssms/

    Du kannst dir also relativ komplexe SQL Statements schreiben, diese je nach Bedarf als Vorlage oder Codeausschnitt hinterlegen und dann einfach einfügen.

    Bei Vorlagen gibt es einen Dialog zum Ersetzen der Parameter (Strg + Shift + M im Abfrage Editor Fenster), besonders bei komplexen Statements mit mehreren Platzhaltern spart der einiges an Zeit.

    Mir ist klar, dass das alles nicht genau auf deine Anforderungen passt aber da es das gewünschte Feature nicht gibt (und wahrscheinlich auch nicht geben wird) wollte ich mögliche Workarounds aufzeigen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Sonntag, 6. März 2016 12:34
    Moderator
  • Herzlichen Dank für deine Tipps, Stefan!!

    Ist bestimmt bedenkens- und ausprobierenswert.

    BTW:
    Ich habe auch noch ein bisschen rumgesucht im Netz und kann sein, dass die auf diesem Link
    http://stackoverflow.com/questions/6694430/create-table-from-view

    gezeigten Ideen eine recht schnelle Lösung sind...

    Grüße-


    Dietrich

    Sonntag, 6. März 2016 13:53
  • ...

    gar nicht. Und das würde auch keinen Sinn machen. Wenn Du nicht immer ORDER BY ... selbst angeben willst, erstell dir eine View, die das für dich macht und frag die dann ab.

    CREATE VIEW qrySortiertNachIrgendwas
    AS
    SELECT   TOP 100 PERCENT
             Spalte1,
             Spalte2,
             ...
    FROM     Tabelle
    ORDER BY SpalteX,
             SpalteY DESC
    ...

    Auf die gefahr hin, Euch jetzt die Laune zu verderben:

    Der Trick mit TOP 100 PERCENT in Kombination mit ORDER BY innerhalb einer Sicht garantiert bereits seit SQL Server 2005(!) offiziell nicht mehr das gewünschte Ergebnis.

    Kleiner Lesetipp dazu: TOP 100 Percent ORDER BY Considered Harmful.


    Andreas Wolter (Blog | Twitter)
    MCSM: Microsoft Certified Solutions Master Data Platform/SQL Server 2012
    MCM SQL Server 2008
    MVP Data Platform
    www.SarpedonQualityLab.com | www.andreas-wolter.com

    Sonntag, 6. März 2016 20:07
  • Hallo Andreas,

    Danke für den Hinweis. Hatte noch was dazu im Hinterkopf, war mir aber nicht mehr wirklich bewusst, dass es so eigentlich überhaupt nicht mehr geht. (Da ich es selbst nie verwende, weil ichs eh für unnötig halte, ...)

    Dietrich: Ein weiterer Grund, ganz auf das von dir angedachte Konsturkt zu verzichten und deine Sortierangaben im SQL Statement für die eigentliche Abfrage anzugeben.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Montag, 7. März 2016 08:49
    Moderator
  • Ich habe auch noch ein bisschen rumgesucht im Netz und kann sein, dass die auf diesem Link

    http://stackoverflow.com/questions/6694430/create-table-from-view

    gezeigten Ideen eine recht schnelle Lösung sind...

    Hallo Dietrich,

    eine rechte schnelle Lösung für was? Wenn Du eine Tabelle ohne jeglichen (Primär- und Fremd)Schlüssel, Index, Einschränkung, Trigger, usw. usw. mit einem Spaltenaufbau, der dem der View entspricht, haben willst, ja, dann kann das eine schnelle Lösung sein.

    Für alles andere, vor allen Dingen dein Sortier"problem" (welches aber nur für dich ein Problem ist): Nö :)


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Montag, 7. März 2016 08:54
    Moderator
  • Mal zum Hintergrund:

    Relationale Datenbanken kennen arbeiten unabhängig von einer „Reihenfolge der Speicherung“. MySQL ist da eine Ausnahme - weil es eigentlich ein „Dateiverwaltungssystem“ ist kann es die „Reihenfolge“ der Zeilen in der Datei beachten. Deswegen ist MySQL auch nicht in jeder Statistik ein RDBMS.

    SQL Server ist aber eines, und kann daher Daten nur für die sogenannte Präsentationsschicht garantiert sortiert zurückgeben. Alles VOR der Präsentationsschicht obliegt der Query Engine bzw der Storage Engine zu entscheiden, wie sie die Daten heranholt.

    Das ORDER BY gehört zur Präsentationsschicht – und vor 2005 war es im Prinzip ein Bug, mit wem man die Engine überlisten konnte, indem man das ORDER BY in eine Sicht integrierte. Mit 2005 wurde das dem ANSI-Standard angepasst

    Je nachdem, was man eigentlich erreichen möchte, kann man mit Prozeduren arbeiten (dort ist ORDER BY erlaubt) oder mit ROW_NUMBER arbeiten. – Nichts aber garantiert, dass bei einem 2. Aufruf nicht plötzlich Daten an einer Position im Resultset auftauchen, die dort vorher nicht waren. Der Key ist eben die „ORDER BY“-Klausel (auch bei ROW_NUMBER)


    Andreas Wolter (Blog | Twitter)
    MCSM: Microsoft Certified Solutions Master Data Platform/SQL Server 2012
    MCM SQL Server 2008
    MVP Data Platform
    www.SarpedonQualityLab.com | www.andreas-wolter.com

    Montag, 7. März 2016 09:06
  • Hi Stefan, es ist kein "Problem" für mich, es war eine "Idee", ob man das praktisch lösen könnte.

    Es geht mir nur darum, wenn man eine "Ersterfassung" von Daten unsortiert macht, sie dann nach Beendigung der Erfassung zu sortieren und als SQL-Server-Datentabelle zu speichern

    Mittlerweile programmiere ich an einer Lösung mittels VB.net. Mal sehen, was dabei herauskommt.
    Ich werde es dann eventuell berichten.

    Schönen Tag an alle und eventuell bis bald-


    Dietrich

    Montag, 7. März 2016 10:29
  • Du kannst die Daten nicht so sortiert speichern, selbst wenn die Daten in der richtigen Reihenfolge gespeichert wären garantiert es dir nicht, dass auch die Ausgabe so sortiert ist. So arbeiten Datenbanksysteme nun mal nicht. 

    Wenn du zum Beispiel auf der Tabelle einen Clustered Index hast, dann ist dem SQL Server egal in welcher Reihenfolge du die Daten speicherst. Die Reihenfolge wird dann nur durch die Index Spalte bestimmt. Und obwohl hier eine physische Sortierung der Tabelle vorliegt muss dies für die Ausgabe nicht so sein.


    Benjamin Hoch
    MCSE: Data Platform
    MCSA: Windows Server 2012
    Blog

    Montag, 7. März 2016 10:34