Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs
ASP German Homepage Homepage
 

Liste

.NET 2.0 (1)
.NET Allgemein (16)
.NET Fu (5)
ADO.NET (11)
Aprilscherz (3)
ASP Grundlagen (44)
ASP Tricks (83)
ASP.NET (44)
ASPIntranet.de (5)
C# (28)
Datenbank (44)
Dokumentation (4)
IIS 6.0 (1)
Komponenten (29)
Optimierung (10)
Server (21)
Sicherheit (34)
Tee Off (6)
VB.NET (6)
WAP (8)
Web Services (11)
XML (9)

RSS 2.0 - Die neuesten fünf Artikel auf AspHeute.com


 

Suchen





 

English Articles
Chinese Articles
Unsere Autoren
 
Link zu AspHeute
Impressum
Werben
Anfragen

Datensätze zufällig sortieren

Geschrieben von: Christoph Wille
Kategorie: Datenbank

Klingt komisch, ist es aber nicht. Oftmals möchte man Datensätze einer Tabelle bei jedem Zugriff in unterschiedlicher Reihenfolge auslesen, um damit eine gewisse "Zufälligkeit" in die Anordnung der Datensätze zu bekommen. Da es keine ORDER Clause "ORDER BY RAND" gibt, muß man sich die Lösung selbst basteln.

Die Ansätze, die ich in diesem Artikel präsentiere, funktionieren nur mit Microsoft SQL Server 7.0 und höher.

Der falsche Ansatz - die RAND Funktion

Es gibt zwar kein ORDER BY RAND, dafür aber existiert die RAND Funktion, die einen Zufallswert liefert:

RAND ( [ seed ] ) 

Damit kann man dem Resultset eine neue Spalte verpassen, die mit Zufallswerten gefüllt wird. Dazu gibt es auch in der SQL Server Dokumentation ein entsprechendes Beispiel - ich habe es auf die authors Tabelle der pubs Datenbank angepasst:

SELECT RAND( (DATEPART(mm, GETDATE()) * 100000 )
           + (DATEPART(ss, GETDATE()) * 1000 )
           + DATEPART(ms, GETDATE()) ) As MyRandId,
         au_id, au_lname
         FROM authors
         ORDER BY MyRandId DESC

Wenn man das jetzt aber ausführt, so erhält man eine mehr oder minder böse Überraschung:

Sollten das nicht Zufallszahlen sein? Sind sie auch, allerdings liegt das Problem beim Seed: RAND liefert mathematische Zufallszahlen, also beim gleichen Seed fängt die Reihe der Zufallszahlen immer gleich an - und da die Abfrage extrem schnell ist, ändert sich der Seed nicht oder nur kaum. Daher sind die Zufallszahlen gleich oder ähnlich, und mit Zufall ist Essig. Und mit der zufälligen Sortierung erst recht.

GUID's to the rescue

Wenn man mit RAND keine Zufallszahlen bekommt, wie kann man dann sonst im SQL Server an Zufallszahlen herankommen? Hier helfen die bei COM Programmierern so allseits beliebten GUIDs (Globally Unique IDs) - diese sind 128 Bit Zahlen, in die die MAC Adresse der Netzwerkkarte, Zeit, usw eingerechnet werden, und die sich wirklich nicht wiederholen.

Der entsprechende Befehl zum Generieren einer GUID in SQL Server sieht wie folgt aus:

NEWID ( ) 

Die Anwendung ist ebenso einfach wie die Syntax:

SELECT NEWID() As MyRandId, au_id, au_lname
         FROM authors
         ORDER BY MyRandId DESC

Eine GUID ist zwar ein Zeichenmonster, aber sicher eindeutig, wie der nachfolgende Screenshot beweist.

Wie oft man auch die Query absetzt, die GUID's werden sich immer ändern, und man hat eine perfekt zufällige Reihenfolge der Datensätze garantiert.

Schlußbemerkung

Oft führen Wege zum Ziel, an die man im ersten Moment gar nicht gedacht hat. Dies trifft sicher für die verschiedenen Anwendungsmöglichkeiten einer GUID zu: zufällige Sortierungen, absolut eindeutige IDs und vieles mehr.

Verwandte Artikel

Optimiertes Erstellen von DropDowns
Records zählen mit Stored Procedures

Wenn Sie jetzt Fragen haben...

Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten.

Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.

 

Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.

Bewerten Sie diesen Artikel
 Sehr gut   Nicht genügend  
   1  2  3  4  5  
 

  
   Für Ausdruck optimierte Seite

©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.