Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Sortierung in SQL Server

Einführung

Den Begriff „Sortierung“ haben Sie in SQL Server sicher schon einmal gehört. Sortierung ist eine Konfiguration, die bestimmt, wie die Sortierung von Zeichendaten durchgeführt wird. Dies ist eine wichtige Einstellung, die einen großen Einfluss darauf hat, wie sich das SQL Server-Datenbankmodul beim Umgang mit Zeichendaten verhält. In diesem Artikel möchten wir Sortierungen im Allgemeinen diskutieren und einige Beispiele für den Umgang mit Sortierungen zeigen.

Wo finde ich Sortierungen?

Sie finden die SQL-Sortierung auf Server-, Datenbank- und Spaltenebene. Eine weitere wichtige Sache, die Sie wissen sollten, ist, dass die Sortierungseinstellung auf Server-, Datenbank- und Spaltenebene nicht identisch sein muss. Außerdem können Sie Ihre Abfragen aktualisieren, um bestimmte Sortierungen zu verwenden. Zu diesem Zeitpunkt werden Sie erkennen, wie wichtig es ist, die richtige Sortierung in Ihrer gesamten Umgebung zu konfigurieren, da eine hohe Wahrscheinlichkeit unerwarteter Probleme besteht, wenn die Sortierung nicht konsistent ist.

Welche verschiedenen Arten von Sortierungen sind verfügbar?

Sie können die vollständige Liste der verfügbaren Sortierungen abrufen, indem Sie die Systemfunktion sys.fn_helpcollations()

abfragen
select * from sys.fn_helpcollations()

Dies wird die folgende Ausgabe zurückgeben.

Wenn Sie nach bestimmten Sortierungen nach Sprache suchen, können Sie den Namen weiter filtern. Wenn Sie beispielsweise nach der von der Sprache Maori unterstützten Sortierung suchen, können Sie die folgende Abfrage verwenden.

select * from sys.fn_helpcollations()
    where name like '%Maori%'

Dies wird die folgende Ausgabe zurückgeben.

Auf diese Weise können Sie nach den unterstützten Sortierungen für die Sortierung Ihrer Wahl suchen. Bei einer einfachen Abfrage der Systemfunktion fn_helpcollations() wurden insgesamt 5508 Zeilen zurückgegeben, was bedeutet, dass so viele Sortierungen unterstützt werden. Beachten Sie, dass dies einen Großteil der Sprachen auf der ganzen Welt abdeckt.

Welche verschiedenen Optionen sehen Sie im Sortierungsnamen?

In dieser Sortierung beispielsweise:Maori_100_CS_AI_KS_WS_SC_UTF8 können Sie die verschiedenen Optionen im Namen der Sortierung sehen.

KS – Groß- und Kleinschreibung beachten
AI – akzentunempfindlich
KS – Kana-Typ-sensitiv
WS – Breitenabhängig
SC – ergänzende Zeichen
UTF8 – Codierungsstandard
Je nach Typ einer ausgewählten Kollatierungsoption verhält sich die SQL Server-Datenbank-Engine beim Umgang mit Zeichendaten für Sortier- und Suchvorgänge unterschiedlich. Wenn Sie beispielsweise die Option zur Berücksichtigung der Groß-/Kleinschreibung in der SQL-Sortierung verwenden, verhält sich die Datenbank-Engine bei einer Abfrageoperation, die nach „Adam“ oder „adam“ sucht, anders. Angenommen, Sie haben eine Tabelle namens „sample“ und es gibt eine Vornamenspalte mit einem Benutzer „adam“. Die folgende Abfrage liefert keine Ergebnisse, wenn es keine Zeile mit dem Vornamen „Adam“ gibt. Dies liegt an der Option „CS-Case sensitive“ in der Sortierung.

select * from sample
    where firstname like '%Adam%'

Anhand dieses einfachen Beispiels können Sie die Bedeutung der Auswahl der richtigen SQL-Sortierungsoption verstehen. Stellen Sie sicher, dass Sie die Anwendungsanforderungen verstehen, bevor Sie überhaupt die Sortierung auswählen.

Sortierung auf SQL Server-Instanz finden

Sie können die Serversortierung in SQL Server Management Studio (SSMS) abrufen, indem Sie mit der rechten Maustaste auf die SQL-Instanz klicken, dann auf die Option „Eigenschaften“ klicken und die Registerkarte „Allgemein“ aktivieren. Diese Sortierung wird standardmäßig bei der Installation von SQL Server ausgewählt.

Alternativ können Sie die serverproperty-Option verwenden, um den Kollationswert zu finden.

select SERVERPROPERTY('collation'),

Kollatierung einer SQL-Datenbank finden

Klicken Sie in SSMS mit der rechten Maustaste auf die SQL-Datenbank und gehen Sie zu den „Eigenschaften“. Sie können die Sortierungsdetails auf der Registerkarte „Allgemein“ wie unten gezeigt überprüfen.

Alternativ können Sie die databasepropertyex-Funktion verwenden, um die Details einer Datenbanksortierung abzurufen.

select DATABASEPROPERTYEX('Your DB Name','collation')

Kollatierung einer Spalte in einer Tabelle finden

Gehen Sie in SSMS zur Tabelle, dann zu den Spalten und klicken Sie schließlich mit der rechten Maustaste auf die einzelnen Spalten, um die „Eigenschaften“ anzuzeigen. Wenn es sich bei der Spalte um einen Zeichendatentyp handelt, sehen Sie Details zur Sortierung.

Wenn Sie jedoch gleichzeitig den Wert auf einen Nicht-Zeichen-Datentyp überprüfen, ist der Kollationswert null. Unten sehen Sie einen Screenshot einer Spalte mit dem Datentyp int.

Alternativ können Sie eine Beispielabfrage unten verwenden, um die Sortierungswerte für Spalten anzuzeigen.

select sc.name, sc.collation_name from sys.columns sc
inner join sys.tables t on sc.object_id=t.object_id
where t.name='t1' – enter your table name

Unten ist die Ausgabe für die Abfrage.

Verschiedene Sortierungen in SQL-Abfragen ausprobieren

In diesem Abschnitt werden wir sehen, wie sich die Sortierreihenfolge auswirkt, wenn in Abfragen unterschiedliche Sortierungen verwendet werden. Eine Beispieltabelle wird wie unten gezeigt mit 2 Spalten erstellt.

Die fname-Spalte hat die Standardsortierung der Datenbank, zu der sie gehört. In diesem Fall lautet die Sortierung SQL_Latin1_General_CP1_CI_AS.
Um einige Datensätze in die Tabelle einzufügen, verwenden Sie die nachstehende Abfrage. Weisen Sie den Parametern Ihre eigenen Werte zu.

insert into emp
  values (1,'mohammed')
  insert into emp 
  values (2,'moinudheen')
  insert into emp
  values (3,'Mohammed')
  insert into emp
  values (4,'Moinudheen')
  insert into emp
  values (5,'MOHAMMED')
  insert into emp
  values (6,'MOINUDHEEN')

Fragen Sie nun die emp-Tabelle ab und sortieren Sie sie nach der fname-Spalte mit verschiedenen Sortierungen. Wir werden die Standardsortierung der Spalte zum Sortieren sowie eine andere Sortierung mit Berücksichtigung der Groß-/Kleinschreibung verwenden – SQL_Latin1_General_CP1_CS_AS.

select * from emp order by fname collate SQL_Latin1_General_CP1_CS_AS 
select * from emp order by fname collate SQL_Latin1_General_CP1_CI_AS – this is default

Die Ausgabe für diese Abfragen ist unten angegeben. Beachten Sie den Unterschied in der verwendeten Sortierung. Wir verwenden die Groß- und Kleinschreibung anstelle der Groß-/Kleinschreibung.

Sie können auch die Abfragepläne für diese beiden Abfragen überprüfen, um den Unterschied zu erkennen. Im ersten Abfrageplan, in dem wir eine andere Sortierung als die in der Spalte verwenden, können Sie den zusätzlichen Operator „Compute Scalar“ bemerken.

Wenn Sie mit der Maus über den Operator „Compute Scalar“ fahren, sehen Sie die zusätzlichen Details wie unten gezeigt. Dies liegt an der impliziten Konvertierung, die stattfindet, da wir eine andere Sortierung als die in der Spalte verwendete Standardsortierung verwenden.

Anhand dieses kleinen Beispiels können Sie die Auswirkungen auf die Abfrageleistung erkennen, wenn Sie Sortierungen explizit in Abfragen verwenden. In unserer Demodatenbank haben wir eine einfache Tabelle verwendet, aber stellen Sie sich ein Echtzeitszenario vor, in dem kleine Änderungen in der Abfrageleistung zu unerwarteten Ergebnissen führen können.

Überprüfen, ob es möglich ist, die Sortierung auf Instanzebene zu ändern

In diesem Abschnitt werden wir verschiedene Szenarien untersuchen, in denen wir möglicherweise die Standardsortierungen ändern müssen. Es können Situationen auftreten, in denen Server oder Datenbanken an Sie übergeben werden und diese möglicherweise nicht Ihren Standardrichtlinien entsprechen, sodass Sie möglicherweise die Sortierung ändern müssen. Die standardmäßige SQL Server-Sortierung ist SQL_Latin1_General_CP1_CI_AS. Das Ändern der Sortierung auf SQL-Instanzebene ist nicht einfach. Es erfordert das Ausschreiben aller Objekte in den Benutzerdatenbanken, das Exportieren der Daten, das Löschen der Benutzerdatenbanken, das erneute Erstellen der Master-Datenbank mit der neuen Sortierung, das Erstellen der Benutzerdatenbanken und das anschließende Importieren aller Daten. Wenn Sie also neue SQL-Instanzen installieren, stellen Sie einfach sicher, dass die Sortierung beim ersten Mal richtig ist, sonst müssen Sie später möglicherweise viel unerwünschte Arbeit erledigen. Eine detaillierte Erläuterung der Phasen zum Ändern der Sortierung auf Instanzebene würde den Rahmen dieses Artikels sprengen, da für jede der Phasen detaillierte Schritte erforderlich sind.

Sortierung auf Datenbankebene ändern

Glücklicherweise ist das Ändern der Sortierung auf Datenbankebene nicht so schwierig wie das Ändern der Sortierung der Instanz. Wir können die Sortierung sowohl mit SSMS als auch mit T-SQL aktualisieren. Klicken Sie in SSMS einfach mit der rechten Maustaste auf die Datenbank, gehen Sie zu „Eigenschaften“ und klicken Sie auf der linken Seite auf die Registerkarte „Optionen“. Dort können Sie die Option zum Ändern der Sortierung im Dropdown-Menü anzeigen.

Klicken Sie abschließend auf „OK“. Ich habe gerade die Datenbanksortierung in SQL_Latin1_General_CP1_CI_AS geändert. Stellen Sie nur sicher, dass Sie diesen Vorgang ausführen, wenn die Datenbank nicht verwendet wird, da der Vorgang andernfalls fehlschlagen wird, wie unten gezeigt.

Verwenden Sie die vorangehende Abfrage, um die Datenbanksortierung mit T-SQL zu ändern.

USE master;  
GO  
ALTER DATABASE mo  
COLLATE SQL_Latin1_General_CP1_CS_AS;  
GO

Sie werden feststellen, dass sich das Ändern der Sortierung auf Datenbankebene nicht auf die Sortierung der vorhandenen Spalten in den Tabellen auswirkt. Sie können die früheren Beispiele verwenden, um die Auswirkungen der Sortierung auf die Sortierreihenfolge für die folgenden Abfragen zu überprüfen.

select * from emp order by fname collate SQL_Latin1_General_CP1_CS_AS 
select * from emp order by fname collate SQL_Latin1_General_CP1_CI_AS – - this is default

Die Sortierung der fname-Spalte bleibt die ursprüngliche und bleibt auch nach Änderung der Sortierung auf Datenbankebene unverändert.

Die neue Sortierung auf Datenbankebene wird jedoch auf alle neuen Spalten in den neuen Tabellen angewendet, die Sie erstellen. Testen Sie daher die Änderung von Datenbanksortierungen immer gründlich, da dies erhebliche Auswirkungen auf die Ausgabe oder das Verhalten von Abfragen hat.

Sortierung auf Spaltenebene ändern

Im vorherigen Abschnitt haben Sie festgestellt, dass die Sortierung der vorhandenen Spalten in den Tabellen auch nach dem Ändern der Sortierung auf Datenbankebene unverändert bleibt. In diesem Abschnitt werden wir sehen, wie wir die Sortierung der vorhandenen Spalten in den Tabellen ändern können, damit sie mit der Sortierung der Datenbank übereinstimmen. Im vorherigen Abschnitt haben Sie die Datenbanksortierung in SQL_Latin1_General_CP1_CS_AS geändert. Als Nächstes möchten Sie alle Spalten in den Benutzertabellen identifizieren, die nicht mit dieser Datenbanksortierung übereinstimmen. Sie können dieses Skript verwenden, um diese Spalten zu identifizieren.

select so.name TableName,sc.name ColumnName, sc.collation_name CollationName from
sys.objects so inner join sys.columns sc on so.object_id=sc.object_id
where sc.collation_name!='SQL_Latin1_General_CP1_CS_AS' and so.[type] ='U'

Die Beispielausgabe meiner Demo-Datenbank ist wie unten gezeigt.

Angenommen, Sie möchten die Sortierung der vorhandenen fname-Spalte in „SQL_Latin1_General_CP1_CS_AS“ ändern, dann können Sie dieses Änderungsskript unten verwenden.

use mo
go
ALTER TABLE dbo.emp ALTER COLUMN fname  
            nvarchar(20) COLLATE SQL_Latin1_General_CP1_CS_AS NULL;  
GO

Wenn Sie die früheren Beispiele verwenden, in denen Sie die Abfrageleistung mit unterschiedlichen Sortierungen überprüft haben, werden Sie feststellen, dass der Operator „compute skalar“ nicht verwendet wird, wenn wir dieselbe Sortierung wie die der Datenbank verwenden. Siehe Screenshot unten. Im vorherigen Beispiel hätten Sie vielleicht bemerkt, dass der Operator „Compute skalar“ im ersten Ausführungsplan verwendet wurde. Da wir die Spaltensortierung so geändert haben, dass sie mit der Datenbanksortierung übereinstimmt, besteht keine Notwendigkeit für eine implizite Konvertierung. Sie werden den Operator „Skalar berechnen“ in der zweiten Abfrage sehen, da er explizit eine andere Sortierung verwendet.

select * from emp order by fname collate SQL_Latin1_General_CP1_CS_AS – - this is default
select * from emp order by fname collate SQL_Latin1_General_CP1_CI_AS

Können wir die Sortierung von Systemdatenbanken ändern?

Das Ändern der Sortierung von Systemdatenbanken ist nicht möglich. Wenn Sie versuchen, die Sortierung der Systemdatenbanken – master, model, msdb oder tempdb – zu ändern, erhalten Sie diese Fehlermeldung.

Sie müssen die zuvor beschriebenen Schritte zum Ändern der Sortierung auf SQL Server-Instanzebene ausführen, um die Sortierung der Systemdatenbanken zu ändern. Es ist wichtig, dass die Sortierungen bei der ersten Installation von SQL Server korrekt sind, um solche Probleme zu vermeiden.

Das bekannte Problem mit Kollationskonflikten

Ein weiteres häufig auftretendes Problem ist der Fehler im Zusammenhang mit Sortierungskonflikten, insbesondere bei der Verwendung temporärer Objekte. Die temporären Objekte werden in der tempdb gespeichert. Die tempdb, die eine Systemdatenbank ist, übernimmt die Sortierung der SQL-Instanz. Wenn Sie Benutzerdatenbanken erstellen, die eine andere Sortierung als die der SQL-Instanz haben, treten bei der Verwendung temporärer Objekte Probleme auf. Auch beim Vergleichen von Spalten in Tabellen mit unterschiedlichen Sortierungen können Probleme auftreten. Inzwischen wissen Sie bereits, dass eine Tabelle Spalten mit unterschiedlichen Sortierungen haben kann, da wir die Sortierung auf Tabellenebene nicht ändern können. Die häufige Fehlermeldung, die Sie bemerken werden, ist etwa „Der Sortierungskonflikt zwischen „Sortierung1“ und „Sortierung2“ kann im gleichen Vorgang nicht gelöst werden“. Collation1 und Collation2 können beliebige Sortierungen sein, die in einer Abfrage verwendet werden. Anhand eines einfachen Beispiels können wir eine Demo dieses Sortierungskonflikts erstellen. Wenn Sie die vorherigen Beispiele in diesem Artikel abgeschlossen haben, verfügen Sie bereits über eine Tabelle mit dem Namen „emp“. Erstellen Sie einfach eine temporäre Tabelle in Ihrer Demodatenbank und fügen Sie Datensätze mit dem bereitgestellten Beispielskript ein.

create table #emptemp
(id int,
 fname nvarchar(20))

insert into  #emptemp
select * from emp

Führen Sie einfach einen Join mit beiden Tabellen aus und Sie erhalten diesen Kollationskonfliktfehler, wie unten gezeigt.

select e.id, et.fname 
from emp e inner join #emptemp et
on e.fname=et.fname

Sie werden feststellen, dass die verwendete Sortierung der Benutzerdatenbank „SQL_Latin1_General_CP1_CS_AS“ ist und nicht mit der Sortierung des Servers übereinstimmt. Um diese Art von Fehler zu beheben, können Sie die Spalten ändern, die in den temporären Objekten verwendet werden, um die Standardsortierung der Benutzerdatenbank zu verwenden. Sie können die Option „database_default“ verwenden oder explizit den Sortierungsnamen der Benutzerdatenbank angeben. In diesem Beispiel verwenden wir die Sortierung „SQL_Latin1_General_CP1_CS_AS“. Versuchen Sie eine dieser Optionen
Option 1: Verwenden Sie die database_default-Option

alter table #emptemp alter column
 fname nvarchar(20) collate database_default

Wenn Sie fertig sind, führen Sie die Select-Anweisung erneut aus und der Fehler wird behoben.
Option 2: Explizit die Sortierung der Benutzerdatenbank verwenden

alter table #emptemp alter column
 fname nvarchar(20) collate SQL_Latin1_General_CP1_CS_AS

Wenn Sie fertig sind, führen Sie die Select-Anweisung erneut aus und der Fehler wird behoben.

Schlussfolgerung

In diesem Artikel haben Sie Folgendes erfahren:
• das Konzept der Sortierung
• die verschiedenen verfügbaren Sortieroptionen
• Finden von Sortierdetails für jede SQL-Instanz, Datenbank und Spalte
• A ARBEITSBEISPIEL zum Ausprobieren von Sortierungsoptionen in SQL-Abfragen
• Ändern von Sortierungen auf Instanzebene, Datenbankebene und Spaltenebene
• WIE MAN Sortierungen von Systemdatenbanken ändert
• ein Sortierungskonflikt und wie um es zu beheben

Jetzt wissen Sie, wie wichtig die Sortierung ist und wie wichtig es ist, die richtige Sortierung auf der SQL-Instanz und auch über die Datenbankobjekte hinweg zu konfigurieren. Testen Sie die verschiedenen Szenarien immer in Ihrer Testumgebung, bevor Sie eine der oben genannten Optionen auf Ihren Produktionssystemen anwenden.