Kopieren von Daten zwischen unterschiedlichen Sortierungen

In Microsoft SQL Server können Daten zwischen Unicode-Spalten problemlos verschoben werden. Eine Konvertierung ist nicht notwendig. Daten, die zwischen Spalten verschoben werden, die Nichtunicode-Zeichendaten enthalten, müssen jedoch von der Quellcodepage in die Zielcodepage konvertiert werden. Eine Codepage ist ein geordneter Zeichensatz eines bestimmten Skripts, in dem jedem Zeichen ein numerischer Index oder ein Codepunktwert zugeordnet ist. Codepages unterstützen Zeichensätze und Tastaturlayouts, die von verschiedenen Microsoft Windows-Gebietsschemas verwendet werden. Ein Liste der unterstützten Codepages finden Sie unter Codepagearchitektur.

Standardmäßig werden Zeichendaten wie folgt konvertiert:

Operation

Zeichendaten konvertiert in

Exportieren

OEM-Codepagezeichen

Importieren

ANSI/Microsoft Windows-Codepagezeichen

Durch die Konvertierung zwischen OEM- und ANSI-Codepages gehen Sonderzeichen oder DBCS-Zeichen (Double-Byte Character Set, Doppelbyte-Zeichensatz) verloren. Um solche Konvertierungen in SQL Server zu vermeiden, können Sie eine Codepage oder eine Sortierung angeben.

HinweisHinweis

Informationen zum Übertragen einer Datenbank von einer Sortierung in eine andere finden Sie auf dieser Microsoft-Website.

In SQL Server wird die physische Speicherung von Zeichenfolgen von Sortierungen gesteuert. Das Festlegen von Sortierungen wird auf vier Ebenen unterstützt: auf der Server-, Datenbank-, Spalten- und Ausdrucksebene. Eine Sortierung gibt drei Eigenschaften an:

  • Die Codepage, die zum Speichern von Nicht-Unicode-Zeichendaten verwendet wird.

  • Die Sortierreihenfolge, die für die Unicode-Datentypen (nchar, nvarchar und ntext) verwendet wird. Eine Sortierreihenfolge definiert die Sequenz, in der Zeichen sortiert werden, und die Methode, die für die Auswertung von Zeichen in Vergleichsvorgängen verwendet wird.

  • Die Sortierreihenfolge, die für die Nichtunicode-Zeichendatentypen (char, varchar und text) verwendet wird.

HinweisHinweis

Microsoft empfiehlt, für jede Spalte einen Sortierungsnamen in einer Formatdatei anzugeben.

Eine Einführung in Codepages und Sortierungen finden Sie unter Sortierung und Unicode-Unterstützung. Ausführliche Informationen finden Sie unter Arbeiten mit Sortierungen.

Verwenden einer Sortierung auf Spaltenebene

In SQL Server 7.0 und höher können Sie die Konvertierung von Daten steuern, indem Sie die Sortierung angeben, mit der die Daten für einen Massenexport im Feld der Zieldatendatei gespeichert werden, oder für einen Massenimportvorgang die Spalte der Zieltabelle. Alle erforderlichen Übersetzungen zwischen der Sortierung der Datendatei und den Sortierungen der Tabellenspalten in der Datenbank werden intern durch den Import- oder Exportvorgang ausgeführt.

HinweisHinweis

Für SQL Server 7.0 und höher kann eine Codepage angegeben werden, es ist jedoch besser, die Sortierung in einer Formatdatei anzugeben.

Sortierungen gelten bei Massenimport- und Massenexportvorgängen immer für SQLCHAR-Spalten. Spaltensortierungen werden für Spalten immer ignoriert, für die SQLCHAR oder SQLNCHAR nicht als Hostdatentyp angegeben ist. Mithilfe von Sortierungen wird die Sortierreihenfolge für SQLCHAR- und SQLNCHAR-Spalten während Massenimportvorgängen bestimmt, bei denen im ORDER-Hinweis auf die Spalten verwiesen wird.

Sie müssen eine Formatdatei verwenden, um die Sortierung anzugeben. Beide Formatdateitypen unterstützen das Angeben von Sortierungen auf Spaltenebene. Informationen zum Verwenden von Sortierungen in Nicht-XML-Formatdateien finden Sie im folgenden Abschnitt, Angeben von Sortierungen auf Spaltenebene in Nicht-XML-Formatdateien. Informationen zum Verwenden von Sortierungen in XML-Formatdateien finden Sie unter Grundlegendes zu XML-Formatdateien.

Angeben von Sortierungen auf Spaltenebene in Nicht-XML-Formatdateien

Die letzte Spalte einer Nicht-XML-Formatdatei (die Spalte an der Ordnungsposition 8) enthält eine Sortierungsspezifikation, die definiert, wie die Daten für diese Spalte in der Datendatei gespeichert werden. Folgende Sortierungsspaltenoptionen sind verfügbar:

Option

Beschreibung

name

Gibt den Namen der Sortierung an, die zum Speichern der Daten in der Datendatei verwendet wird. Ein Liste der SQL-Sortierungsnamen finden Sie unter SQL Server-Sortierungsname (Transact-SQL).

RAW

Gibt an, dass die Daten in der Codepage gespeichert werden, die in einer Codepageoption im Befehl oder im BCPFILECP-Hinweis von bcp_control angegeben ist. Wenn keine dieser Optionen angegeben ist, wird für die Datendatei die Sortierung der OEM-Codepage des Clientcomputers verwendet.

HinweisHinweis
Weitere Informationen zu den Codepageoptionen finden Sie weiter unten unter "Verwenden einer Codepage". Weitere Informationen zum BCPFILECP-Hinweis finden Sie unter bcp_control.

""

Ist identisch mit RAW.

Beispiele

Das folgende Beispiel zeigt eine Nicht-XML-Formatdatei, in der für die Felder 2 und 3 Spaltensortierungen angegeben sind. Die Sortierungsinformationen sind fett dargestellt.

9.0
4
1       SQLCHAR       0       7       "\t"     1     DepartmentID     ""
2       SQLCHAR       0       100     "\t"     2     Name             SQL_Latin1_General_CP1_CI_AS
3       SQLCHAR       0       100     "\t"     3     GroupName        SQL_Latin1_General_CP1_CI_AS
4       SQLCHAR       0       24      "\r\n"   4     ModifiedDate     ""
HinweisHinweis

Die vorausgehende Formatdatei betrifft die HumanResources.Department-Tabelle in der AdventureWorks-Beispieldatenbank, die vier Spalten aufweist: DepartmentID, Name, GroupName und ModifiedDate. Weitere Informationen zu dieser Tabelle finden Sie unter Department-Tabelle (AdventureWorks).

Weitere Informationen zu Nicht-XML-Formatdateien finden Sie unter Grundlegendes zu Nicht-XML-Formatdateien.

Verwenden einer Codepage

HinweisHinweis

Um die Konvertierung von Daten zu steuern, empfiehlt Microsoft die Verwendung einer Formatdatei, um Sortierungen auf Spaltenebene für einen Massenexport- oder Massenimportvorgang anzugeben. Weitere Informationen finden Sie weiter oben unter "Verwenden einer Sortierung auf Spaltenebene".

Für das Angeben einer Codepage gilt folgende Syntax:

  • Um eine Codepage in einem bcp-Befehl anzugeben, verwenden Sie den Schalter -C:

    -C { ACP | OEM | RAW | code_page }

  • Um eine Codepage in einer BULK INSERT- oder INSERT ... SELECT * FROM OPENROWSET(BULK...)-Anweisung anzugeben, verwenden Sie die Option CODEPAGE.

    CODEPAGE = { **'**ACP '| **'**OEM '| **'**RAW '| 'code_page' }

Sowohl der Schalter -C als auch die Option CODEPAGE akzeptieren die folgenden Werte für die Codepage.

Codepagewert

Beschreibung

ACP

Gibt während eines Importvorgangs an, dass Datenfelder vom Datentyp char, varchar oder text von der ANSI/Windows-Codepage (ISO 1252) in die SQL Server-Codepage konvertiert werden.

Gibt während eines Exportvorgangs an, dass bcp diese Spalten von der SQL Server-Codepage in die ANSI/Windows-Codepage konvertiert.

OEM (Standard)

Gibt während eines Importvorgangs an, dass Datenfelder vom Datentyp char, varchar oder text von der OEM-Codepage des Systems in die SQL Server-Codepage konvertiert werden.

Gibt während eines Exportvorgangs an, dass bcp diese Spalten von der SQL Server-Codepage in die OEM-Codepage des Systems konvertiert.

RAW

Es erfolgt keine Konvertierung von einer Codepage zu einer anderen. Dies ist die schnellste Option.

code_page

Eine spezifische Codepagenummer (z. B. 850). Ein Liste der unterstützten Codepages finden Sie unter Codepagearchitektur.

Beispiele

Die folgenden Beispiele verwenden die HumanResources.myTeam-Tabelle in der AdventureWorks-Datenbank. Bevor Sie die Beispiele ausführen können, müssen Sie diese Tabelle erstellen. Informationen zu dieser Tabelle und zur Vorgehensweise zum Erstellen dieser Tabelle finden Sie unter Erstellen der HumanResources.myTeam-Tabelle.

HinweisHinweis

Vor dem Testen des folgenden Beispiels sollten Sie die vorhandenen Zeilen in der myTeam-Tabelle löschen, um Primärschlüsselkonflikte zu vermeiden.

A. Verwenden einer Codepage mit bcp

Dieses Beispiel verwendet bcp zum Massenexportieren der Daten aus der HumanResources.myTeam-Tabelle in der AdventureWorks-Datenbank in die Datendatei myTeam850.txt. Außerdem wird die Codepage 850 verwendet. Geben Sie an der Windows-Eingabeaufforderung Folgendes ein:

bcp AdventureWorks.HumanResources.myTeam out myTeam850.txt -c -C850 -T

B. Verwenden einer Codepage mit BULK INSERT

Dieses Beispiel verwendet BULK INSERT zum Massenimportieren der Datei myTeam850.txt, die im vorherigen bcp-Beispiel erstellt wurde, in die AdventureWorksHumanResources.myTeam-Tabelle.

Führen Sie mithilfe eines Abfragetools wie dem SQL Server Management Studio-Abfrage-Editor die folgenden Anweisungen aus:

USE AdventureWorks
GO
DELETE HumanResources.myTeam
GO
BULK INSERT HumanResources.myTeam 
   FROM 'C:\myTeam850.txt'
   WITH (CODEPAGE = 850);
GO

Massenexportieren von Daten zwischen unterschiedlichen Sortierungen

Bei einem Massenexportvorgang steuert die Sortierung die Codepage, die zum Speichern von Zeichendaten in der Datendatei verwendet wird. Dies gilt für folgende Elemente:

  • Alle Spalten in einer Datendatei im Zeichenformat

  • Alle Spalten in einer systemeigenen Datei, bei denen SQLCHAR als Hostdatei-Datentyp angegeben ist

  • SQLCHAR-Zeichen, deren Werte größer als 127 oder kleiner als 32 sind

    Sortierungen werden auf Zeichen angewendet, deren Werte zwischen 32 und 127 liegen. Alle Codepages ordnen jedoch den Werten zwischen 32 und 127 dieselben Zeichen zu, weshalb die Verwendung unterschiedlicher Sortierungen keine Auswirkung hat.

Es gelten die folgenden Regeln, um zu bestimmen, welche Sortierung oder Codepage für einen Massenexportvorgang verwendet wird:

  • Wenn eine Spaltensortierung in einer Formatdatei oder mithilfe der ODBC-Funktion bcp_setcolfmt (bcp_setcolfmt) angegeben wird, werden die Zeichendaten mit der ANSI-Codepage, die der Sortierung zugeordnet ist, gespeichert.

  • Wenn keine Spaltensortierung angegeben wurde, aber eine Codepage mithilfe der Codepageoption im Befehl oder im BCPFILECP-Hinweis von bcp_control angegeben wurde, werden alle SQLCHAR-Daten aus Spalten ohne definierte Spaltensortierung mit der angegebenen Codepage gespeichert.

    HinweisHinweis

    Weitere Informationen zu den Codepageoptionen finden Sie weiter oben unter "Verwenden einer Codepage". Weitere Informationen zum BCPFILECP-Hinweis finden Sie unter bcp_control.

  • Wenn Sie keine Sortierung oder Codepage angeben, werden SQLCHAR-Daten mithilfe der OEM-Codepage des Clientcomputers gespeichert.

HinweisHinweis

Informationen zur Sortierung/Codepage werden nicht in einer Datendatei gespeichert.

Massenimportieren von Daten zwischen unterschiedlichen Sortierungen

Für einen Massenimportvorgang gilt die Interpretation der Codepage für Spalten, die in einer Datendatei im Zeichenformat (SQLCHAR) gespeichert sind. In einer Datendatei im Zeichenformat werden alle Spalten als SQLCHAR gespeichert. Da keine Informationen zur Sortierung/Codepage in einer Datendatei gespeichert werden, müssen Sie für einen Massenimportvorgang die Informationen zur Sortierung/Codepage der Datendateien bereitstellen.

Es gelten die folgenden Regeln, um zu bestimmen, welche Sortierung oder Codepage für einen Massenimportvorgang verwendet wird:

  • Wenn eine Spaltensortierung in einer Formatdatei oder mithilfe der ODBC-Funktion bcp_setcolfmt (bcp_setcolfmt) angegeben wird, werden die SQLCHAR-Daten in einer Datendatei mit der ANSI-Codepage, die der angegebenen Spaltensortierung zugeordnet ist, interpretiert. Stellen Sie sicher, dass die angegebenen Sortierungen mit den Sortierungen in der Datendatei übereinstimmen.

  • Wenn keine Spaltensortierung angegeben ist, aber eine Codepage mithilfe der Codepageoption im Befehl oder im BCPFILECP-Hinweis von bcp_control angegeben wird, werden die SQLCHAR-Daten mit der angegebenen Codepage interpretiert.

    HinweisHinweis

    Weitere Informationen zu den Codepageoptionen finden Sie weiter oben unter Verwenden einer Codepage. Weitere Informationen zum BCPFILECP-Hinweis finden Sie unter bcp_control.

  • Wenn Sie keine Sortierung oder Codepage angeben, werden Daten in SQLCHAR-Spalten mithilfe der OEM-Codepage des Clientcomputers interpretiert.

Bei einem Massenimportvorgang steuert die definierte Sortierung Folgendes:

  • Wie der Vorgang versucht, die Codepage der SQLCHAR-Spalten in der Datendatei zu interpretieren.

  • Wie bcp oder BULK INSERT den ORDER-Hinweis anwendet, falls dieser angegeben ist.

    Wenn Sie den ORDER-Hinweis verwenden, interpretiert der Massenimportvorgang den ORDER-Hinweis mithilfe von Sortierungen ordnungsgemäß. Dieser Hinweis gilt für SQLCHAR- und SQLNCHAR-Spalten. Die Daten in den Spalten, auf die durch den ORDER-Hinweis verwiesen wird, müssen in der für die Spalten definierten Sortierung vorliegen. Weitere Informationen finden Sie unter Steuern der Sortierreihenfolge beim Massenimport von Daten.