# Strings in SQL sortieren



## nitrane (23. Juni 2007)

Hallo,

ich habe eine SQL Datenbank wo mehrere Einträge sind. Eine Spalte mit dem Nachnamen von Kunden soll sortiert werden. "Leider" ist der Datentyp ntext. Ich arbeite momentan mit VS 2005 und der .net Compact Architektur. Da die Einträge Strings sind, können diese nicht einfach mit dem SQL Befehl:

SELECT * FROM DB ORDER BY Nachname

Ich habe es mit umwandeln in Char Array usw. probiert, ist aber keine elegante Lösung. Was könnte man noch machen  Es muss doch irgendwie gehen die Nachname in eine gute Ordnung zu bringen :suspekt:.

gruß


----------



## Nico Graichen (23. Juni 2007)

Hi

ORDER BY unterstützt nicht die Sortierung auf LOB-Daten (siehe auch http://msdn2.microsoft.com/de-de/library/ms188385.aspx)

Mir stellt sich aber die Frage, warum Namen in einer LOB-Spalte abgelegt werden 
Mir ist kein Name bekannt, der so viele Zeichen enthält, dass man dafür 4 GB Speicher zur Verfügung stellen muss.


----------



## nitrane (23. Juni 2007)

Tja leider geht das nicht laut MS. Wie gesagt, dass Ganze ist eine Pocket PC Anwendung und darauf läuft halt ne kleine SQL Datenbank. 

Könnte man die Namen in einen anderen Datentypen umwandeln oder so ? Ich hatte die Idee einen String eventuell in ein Char Array umzuwandeln. Nur wird das alles wieder fürchterlich kompliziert. Hm.


----------



## Nico Graichen (24. Juni 2007)

Hi

Du solltest die persitente Seite (Datenbank) und die programmatische Seite auseinander halten.
Wie bereits erwähnt, ist es sinnlos, für Namen einen Datentyp zu wählen, der 4 GB Speicher zur Verfügung stellt. Änder den Datentyp der Spalte in (N)VARCHAR und du hast erheblich weniger Probleme. (N)TEXT solltest du nur verwenden, wenn du wirklich lange Texte (mehr als 4000 Zeichen) speichern willst. Ansonsten ist dies nur unnützer Overhead und stellt dich vor Probleme (wie du siehst).

Konvertierung von Datentypen funktiniert übrigens mit der T-SQL Funktion CONVERT


----------



## nitrane (24. Juni 2007)

Gut das werde ich dann auch mal versuchen. Klingt natürlich einleuchtend. 

Noch eine andere Frage: Wenn ich die Datenbank dann erfolgreich sortiert habe, habe ich noch ein anderes Problem. Ich hab den Datenbankeinträgen jeweils eine KundenID gegeben. Quasi wenn ein neues Element angelegt wird, kriegt es eine Nummer zugewiesen, die dann jedesmal erhöht wird. Wenn ich dann mit deiner Methode sortiere, also nach Nachnamen, dann stehen die KundenIDs total durcheinander.

Gibt es also eine Möglichkeit zu sagen, sortiere meine Datenbank nach Nachnamen und dann nummeriere die KundenIDs in der ersten Spalte korrekt durch. Hat damit was zu tun, das ich mit den IDs später arbeiten werde. 

Hab leider nicht so die SQL Kenntnisse, deshalb kommen solche Fragen ;-).

gruß


----------



## Sparks (24. Juni 2007)

Hi,

die KundenID's zu ändern macht wirklich keinen Sinn (ID steht ja für *ID*entifikation).
Die sind doch sicherlich dafür gedacht, dass Du dazu eine Relation in andere Tabellen herstelltst.
Also z. B. eine Tabelle, in der die Rechnungen an Kunden erfasst sind.
Wenn dann die ID's geändert würden (besser: geändert werden könnten), würde ja nix mehr stimmen! Es sei denn, Du würdest alle ID's (gleichzeitig!) ändern.
Wozu soll da also etwas geändert werden?
Die Sortierung über den Nachnamen ist kein Problem, sobald Du den Datentyp, wie von niggo beschrieben, geändert hast.
Probiere es mal aus...


----------



## Nico Graichen (24. Juni 2007)

Zudem ist es vollkommen egal (in den meisten Fällen jedenfalls), in welcher Reihenfolge die Datensätze in einer Tabelle stehen. Das sortierte Eintragen von Datensätzen macht wenig Sinn, zumal mit jedem neuen Datensatz das Prozedere von vorn beginnt.
Die Sortierung, wie du sie vorhast, findet beim Lesen aus der Tabelle statt und ist auch vorkommen ausreichend. 
Je nachdem, wie die Datensätze angezeigt werden, ist nicht einmal die Sortierung bei der Abfrage nötig sondern kann auch im Business- oder Presentation-Layer vorgenommen werden.


----------



## nitrane (24. Juni 2007)

Ok, das macht alles natürlich Sinn. Jetzt muss ich schauen ,dass ich die Spalte Nachname komplett als Char Array abspeichere. Der Datentyp der SQL Spalte ist ja nchar.


----------



## Nico Graichen (24. Juni 2007)

nitrane hat gesagt.:


> Der Datentyp der SQL Spalte ist ja nchar.


Wie oben bereits geschrieben wäre es besser, wenn du den Datentyp (N)VARCHAR nutzt.
Da Namen eine unterschiedliche Länge haben, ist die CHAR als Datentyp ungeeignet.
Der String "Ei" nimmt in ein CHAR-Spalte genauso viel Speicherplatz ein wie "Ichweißnicht wasfüreinlangerName".
Zeichenketten in einer CHAR-Spalte nutzen immer den selben Speicher, unabhängig ihrer Länge.
In einer VARCHAR-Spalte belegt ein String nur soviel Platz, wie er auch Zeichen hat.

Bleiben wir am Beispiel "Ei":
In einer CHAR(10)-Spalte belegt der String "Ei" 10 Byte. In einer VARCHAR(10)-Spalte hingegen nur 2 Byte.


Kleiner Hinweis:
Du solltest dich, bevor du weitermachst, mit Datenbankgrundlagen auseinandersetzen.


----------

