Freigeben über


CAST und CONVERT (Transact-SQL)

Konvertiert einen Ausdruck von einem Datentyp in einen anderen in SQL Server 2012.

Themenlink (Symbol) Transact-SQL-Syntaxkonventionen

Syntax

Syntax for CAST:
CAST ( expression AS data_type [ ( length ) ] )

Syntax for CONVERT:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )

Argumente

  • expression
    Ein beliebiger gültiger Ausdruck.

  • data_type
    Der Zieldatentyp. Hierzu zählen xml, bigint und sql_variant. Aliasdatentypen können nicht verwendet werden.

  • length
    Eine optionale Ganzzahl, die die Länge des Zieldatentyps angibt. Der Standardwert ist 30.

  • style
    Ein ganzzahliger Ausdruck, der angibt, wie die CONVERT-Funktion expression übersetzt. Wenn style NULL ist, wird NULL zurückgegeben. Der Bereich wird durch data_type festgelegt. Weitere Informationen finden Sie im Abschnitt mit den Hinweisen.

Rückgabetypen

Gibt die Übersetzung von expression in data_type zurück.

Hinweise

Datums- und Zeitformate

Wenn expression ein Datums- oder Uhrzeitdatentyp ist, kann style einer der in der folgenden Tabelle aufgelisteten Werte sein. Andere Werte werden als 0 verarbeitet. Ab SQL Server 2012 sind die einzigen Formate, die bei der Konvertierung von Datums- und Uhrzeittypen in datetimeoffset unterstützt werden, 0 oder 1. Bei allen anderen Konvertierungsformaten wird der Fehler 9809 zurückgegeben.

SQL Server unterstützt das Datumsformat im arabischem Format durch Verwendung des kuwaitischen Algorithmus.

Ohne Jahrhundert (yy) (1)

Mit Jahrhundert (yyyy)

Standard

Eingabe/Ausgabe (3)

-

0 oder 100 (1, 2)

Standard für datetime und smalldatetime

mon tt jjjj hh:miAM (oder PM)

1

101

USA

1 = mm/tt/jj

101 = mm/tt/jjjj

2

102

ANSI

2 = jj.mm.tt

102 = jjjj.mm.tt

3

103

Britisch/Französisch

3 = tt/mm/jj

103 = tt/mm/jjjj

4

104

Deutsch

4 = tt.mm.jj

104 = tt.mm.jjjj

5

105

Italienisch

5 = tt-mm-jj

105 = tt-mm-jjjj

6

106 (1)

-

6 = tt mon jj

106 = tt mon jjjj

7

107 (1)

-

7 = Mon tt, jj

107 = Mon tt, jjjj

8

108

-

hh:mi:ss

-

9 oder 109 (1, 2)

Standardwert + Millisekunden

mon tt jjjj hh:mi:ss:mmmAM (oder PM)

10

110

USA

10 = mm-tt-jj

110 = mm-tt-jjjj

11

111

JAPAN

11 = jj/mm/tt

111 = jjjj/mm/tt

12

112

ISO

12 = jjmmtt

112 = jjjjmmtt

-

13 oder 113 (1, 2)

Europ. Standard + Millisekunden

tt mon jjjj hh:mi:ss:mmm(24h)

14

114

-

hh:mi:ss:mmm(24h)

-

20 oder 120 (2)

ODBC kanonisch

jjjj-mm-tt hh:mi:ss(24h)

-

21 oder 121 (2)

ODBC kanonisch (mit Millisekunden) Standard für time, date, datetime2 und datetimeoffset

jjjj-mm-tt hh:mi:ss.mmm(24h)

-

126 (4)

ISO8601

jjjj-mm-ttThh:mi:ss.mmm (keine Leerzeichen)

HinweisHinweis

Wenn der Wert für Millisekunden (mmm) 0 ist, wird der Millisekundenwert nicht angezeigt. Beispielsweise wird der Wert '2012-11-07T18:26:20.000' als '2012-11-07T18:26:20' angezeigt.

-

127(6, 7)

ISO8601 mit Zeitzone (Z).

jjjj-mm-ttThh:mi:ss.mmmZ (keine Leerzeichen)

HinweisHinweis

Wenn der Wert für Millisekunden (mmm) 0 ist, wird der Millisekundenwert nicht angezeigt. Beispielsweise wird der Wert '2012-11-07T18:26:20.000' als '2012-11-07T18:26:20' angezeigt.

-

130 (1, 2)

Hijri (5)

tt mon jjjj hh:mi:ss:mmmAM

In diesem Format entspricht "mon" dem vollständigen Monatsnamen in Form einer Hijri-Unicode-Darstellung mit mehreren Token. In einer standardmäßigen US-Installation von SSMS wird dieser Wert nicht ordnungsgemäß gerendert.

-

131 (2)

Hijri (5)

tt/mm/jjjj hh:mi:ss:mmmAM

1 Diese Formatwerte geben nicht deterministische Ergebnisse zurück. Dazu gehören alle (yy)-Formate (ohne Jahrhundert) und eine Teilmenge der (yyyy)-Formate (mit Jahrhundert).

2 Die Standardwerte (style 0 oder 100, 9 oder 109, 13 oder 113, 20 oder 120 und 21 oder 121) geben immer das Jahrhundert zurück (yyyy).

3 Eingabe, wenn in datetime konvertiert wird; Ausgabe, wenn in Zeichendaten konvertiert wird.

4 Vorgesehen für XML-Verwendung. Für eine Konvertierung aus datetime- oder smalldatetime-Daten in Zeichendaten ist das Ausgabeformat so wie in der Tabelle beschrieben.

5 Hijri ist ein Kalendersystem mit mehreren Variationen. SQL Server verwendet den kuwaitischen Algorithmus.

Wichtiger HinweisWichtig

Standardmäßig verwendet SQL Server bei der Interpretation von zweistelligen Jahresangaben 2049 als Umstellungsjahr. Das zweistellige Jahr 49 wird also als 2049 und das zweistellige Jahr 50 als 1950 interpretiert. Viele Clientanwendungen, z. B. jene auf Grundlage der Automatisierungsobjekte, verwenden als Umstellungsjahr 2030. SQL Server stellt die Konfigurationsoption two digit year cutoff zur Änderung des Umstellungsjahres bereit, die von SQL Server verwendet wird, und ermöglicht die konsistente Behandlung von Datumsangaben. Die Verwendung von vierstelligen Jahresangaben wird empfohlen.

6 Wird nur bei der Umwandlung mit CAST von Zeichendaten in datetime- oder smalldatetime-Werte unterstützt. Wenn Zeichendaten, die nur Zeit- oder nur Datumskomponenten darstellen, in die Datentypen datetime oder smalldatetime umgewandelt werden, wird die nicht angegebene Zeitkomponente auf 00:00:00.000 festgelegt und die nicht angegebene Datumskomponente auf 1900-01-01.

7 Der optionale Zeitzonenindikator Z vereinfacht die Zuordnung von XML-datetime-Werten mit Zeitzoneninformationen zu SQL Server-datetime-Werten ohne Zeitzone. Z ist der Indikator für Zeitzonen-UTC-0. Andere Zeitzonen werden durch einen positiven (+) oder negativen (-) Offset (HH:MM) angegeben. Beispiel: 2006-12-12T23:45:12-08:00.

Bei der Konvertierung von smalldatetime-Daten in Zeichendaten werden bei Formaten mit Sekunden oder Millisekunden an diesen Stellen Nullen ausgegeben. Sie können unerwünschte Teile in Datumsangaben abschneiden, indem Sie bei der Konvertierung von Werten der Datentypen datetime oder smalldatetime in einen char- oder varchar-Datentyp eine entsprechende Länge angeben.

Bei der Konvertierung in datetimeoffset von Zeichendaten mit einem Zeitformat wird dem Ergebnis ein Zeitzonenoffset angehängt.

float- und real-Formate

Wenn expression den Datentyp float oder real aufweist, kann style einer der Werte in der folgenden Tabelle sein. Andere Werte werden als 0 verarbeitet.

Wert

Ausgabe

0 (Standardwert)

Maximal 6 Ziffern. Wird gegebenenfalls in der wissenschaftlichen Schreibweise verwendet

1

Immer 8 Ziffern. Wird immer in der wissenschaftlichen Schreibweise verwendet

2

Immer 16 Ziffern. Wird immer in der wissenschaftlichen Schreibweise verwendet

126, 128, 129

Aufgenommen zur Kompatibilität mit Legacykomponenten, in zukünftigen Versionen möglicherweise als veraltet markiert.

money- und smallmoney-Formate

Wenn expression den Datentyp money oder smallmoney aufweist, kann style einer der Werte in der folgenden Tabelle sein. Andere Werte werden als 0 verarbeitet.

Wert

Ausgabe

0 (Standardwert)

Links vom Dezimaltrennzeichen werden keine Tausendertrennzeichen eingefügt, rechts vom Dezimaltrennzeichen stehen zwei Ziffern; z. B. 4235.98.

1

Links vom Dezimaltrennzeichen werden Tausendertrennzeichen eingefügt, rechts vom Dezimaltrennzeichen stehen zwei Ziffern; z. B. 3,510.92.

2

Links vom Dezimaltrennzeichen werden keine Tausendertrennzeichen eingefügt, rechts vom Dezimaltrennzeichen stehen vier Ziffern; z. B. 4235.9819.

126

Entspricht Format 2 bei der Konvertierung in char(n) oder varchar(n)

xml-Formate

Wenn expression xml ist, kann , style einer der Werte in der folgenden Tabelle sein. Andere Werte werden als 0 verarbeitet.

Wert

Ausgabe

0 (Standardwert)

Verwenden Sie das Standardanalyseverhalten, bei dem bedeutungslose Leerzeichen verworfen werden und interne DTD-Teilmengen nicht zulässig sind.

HinweisHinweis

Beim Konvertieren in den xml-Datentyp werden bedeutungslose Leerzeichen aus SQL Server anders behandelt als in XML 1.0. Weitere Informationen finden Sie unter Erstellen von Instanzen der XML-Daten.

1

Bedeutungslose Leerzeichen erhalten. Mit dieser Formateinstellung wird festgelegt, dass die Standardbehandlung xml:space sich so verhält, als wäre stattdessen xml:space="preserve" angegeben worden.

2

Begrenzte interne DTD-Teilmengenverarbeitung aktivieren.

Bei aktivierter interner Teilmengenverarbeitung kann der Server die folgenden Informationen, die in einer internen DTD-Teilmenge bereitgestellt werden, zur Ausführung von Analysevorgängen ohne Überprüfungscharakter verwenden.

  • Für Attribute werden die Standardwerte angewendet.

  • Interne Entitätsverweise werden aufgelöst und erweitert.

  • Das DTD-Inhaltsmodell wird auf seine syntaktische Richtigkeit geprüft.

Der Parser ignoriert externe DTD-Teilmengen. Er nimmt auch keine Auswertung der XML-Deklaration vor, um festzustellen, ob das standalone-Attribut auf yes oder no festgelegt ist. Stattdessen wird die XML-Instanz wie ein eigenständiges Dokument analysiert.

3

Bedeutungslose Leerzeichen erhalten und die begrenzte interne DTD-Teilmengenverarbeitung aktivieren.

Binäre Formate

Wenn expression den Datentyp binary(n), varbinary(n), char(n) oder varchar(n) aufweist, kann style einer der Werte in der folgenden Tabelle sein. Bei Formatwerten, die nicht in der Tabelle aufgelistet sind, wird ein Fehler zurückgegeben.

Wert

Ausgabe

0 (Standardwert)

Übersetzt ASCII-Zeichen in binäre Bytes bzw. binäre Bytes in ASCII-Zeichen. Jedes Zeichen bzw. Byte wird 1:1 konvertiert.

Wenn data_type ein binärer Typ ist, werden die Zeichen 0x links neben dem Ergebnis hinzugefügt.

1, 2

Wenn data_type ein binärer Typ ist, muss der Ausdruck ein Zeichenausdruck sein. expression muss aus einer geraden Anzahl hexadezimaler Zeichen bestehen (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, a, b, c, d, e, f). Wenn style auf 1 festgelegt wird, müssen die Zeichen 0x die ersten beiden Zeichen im Ausdruck sein. Wenn der Ausdruck eine ungerade Anzahl an Zeichen oder ein ungültiges Zeichen enthält, wird ein Fehler ausgelöst.

Wenn die Länge des konvertierten Ausdrucks die Länge von data_type übersteigt, wird das Ergebnis rechts abgeschnitten.

Bei data_types mit fester Länge, die länger sind als das konvertierte Ergebnis, wird im Ergebnis rechts die entsprechende Anzahl Nullen angehängt.

Wenn data_type ein Zeichentyp ist, muss der Ausdruck ein binärer Ausdruck sein. Jedes Binärzeichen wird in zwei Hexadezimalzeichen konvertiert. Wenn die Länge des konvertierten Ausdrucks die Länge von data_type übersteigt, wird das Ergebnis rechts abgeschnitten.

Wenn data_type ein Zeichentyp mit fester Länge ist und die Länge des konvertierten Ergebnisses kleiner ist als die Länge von data_type, werden dem konvertierten Ausdruck rechts Leerstellen hinzugefügt, um eine gerade Anzahl an Hexadezimalstellen zu erhalten.

Bei style 1 werden links neben dem konvertierten Ergebnis die Zeichen 0x hinzugefügt.

Implizite Konvertierungen

Implizite Konvertierungen sind Konvertierungen, die ohne Angabe der CAST- oder CONVERT-Funktion durchgeführt werden. Explizite Konvertierungen sind Konvertierungen, die die Angabe der CAST- oder CONVERT-Funktion erfordern. In der folgenden Abbildung werden alle expliziten und impliziten Datentypkonvertierungen aufgeführt, die für die vom SQL Server-System bereitgestellten Datentypen zulässig sind. Zu diesen gehören xml, bigint und sql_variant. Es gibt keine implizite Konvertierung bei der Zuweisung vom sql_variant-Datentyp, eine implizite Konvertierung zum sql_variant-Datentyp findet jedoch statt.

TippTipp

Dieses Diagramm ist als herunterladbare PDF-Datei im Microsoft Download-Center verfügbar.

Datentyp-Konvertierungstabelle

Beim Konvertieren zwischen datetimeoffset und den Zeichentypen char, varchar, nchar und nvarchar sollte der konvertierte Zeitzonenteil sowohl für HH als auch für MM stets zwei Stellen umfassen, beispielsweise -08:00.

HinweisHinweis

Da Unicode-Daten immer eine gerade Anzahl von Bytes verwenden, muss das Konvertieren von binary- oder varbinary-Datentypen in oder von Unicode-Datentypen vorsichtig erfolgen. Die folgende Konvertierung gibt z. B. nicht den Hexadezimalwert 41, sondern 4100 zurück: SELECT CAST(CAST(0x41 AS nvarchar) AS varbinary).

Datentypen mit umfangreichen Werten

Datentypen mit umfangreichen Werten weisen das gleiche implizite und explizite Konvertierungsverhalten auf wie ihre kleineren Gegenstücke, insbesondere die Datentypen varchar, nvarchar und varbinary. Sie sollten jedoch die folgenden Richtlinien beachten:

  • Die Konvertierung von image in varbinary(max) und umgekehrt ist eine implizite Konvertierung. Das Gleiche gilt für Konvertierungen zwischen text und varchar(max) sowie zwischen ntext und nvarchar(max).

  • Die Konvertierung von Datentypen mit hohen Werten, z. B. varchar(max), in einen entsprechenden kleineren Datentyp, z. B. varchar, ist zwar eine implizite Konvertierung, doch kommt es zu einer Abschneidung, wenn der umfangreiche Wert sich als zu groß für die angegebene Länge des kleineren Datentyps erweist.

  • Die Konvertierung von varchar, nvarchar oder varbinary in den jeweils entsprechenden Datentyp mit umfangreichen Werten wird implizit ausgeführt.

  • Die Konvertierung vom sql_variant-Datentyp in einen Datentyp mit umfangreichen Werten ist eine explizite Konvertierung.

  • Datentypen mit umfangreichen Werten können nicht in den sql_variant-Datentyp konvertiert werden.

Weitere Informationen zum Konvertieren des xml-Datentyps finden Sie unter Erstellen von Instanzen der XML-Daten.

XML-Datentyp

Wenn Sie den xml-Datentyp explizit oder implizit in einen Zeichenfolgen- oder Binärdatentyp umwandeln, wird der Inhalt des xml-Datentyps nach einer Reihe von Regeln serialisiert. Informationen zu diesen Regeln finden Sie unter Definieren der Serialisierung von XML-Daten. Informationen dazu, wie sich andere Datentypen in den xml-Datentyp konvertieren lassen, finden Sie unter Erstellen von Instanzen der XML-Daten.

Datentypen text und image

Die automatische Datentypkonvertierung wird für die Datentypen text und image nicht unterstützt. Die explizite Konvertierung von text-Daten in Zeichendaten und von image- in binary- oder varbinary-Daten ist zwar möglich, doch nur bis zu einer maximalen Länge von 8000 Bytes. Falls Sie versuchen, eine unzulässige Konvertierung vorzunehmen, wie z. B. die Konvertierung eines Zeichenausdrucks mit Buchstaben in int-Daten, gibt SQL Server eine Fehlermeldung zurück.

Ausgabesortierung

Wenn sowohl die Ausgabe von CAST oder CONVERT als auch die Eingabe eine Zeichenfolge ist, hat die Ausgabe dieselbe Sortierung und Sortierungsbezeichnung wie die Eingabe. Wenn die Eingabe keine Zeichenfolge ist, hat die Ausgabe die Standardsortierung der Datenbank und die Sortierungsbezeichnung coercible-default (Standard erzwingbar). Weitere Informationen finden Sie unter Rangfolge von Sortierungen (Transact-SQL).

Wenn Sie der Ausgabe eine andere Sortierung zuweisen möchten, wenden Sie die COLLATE-Klausel auf den Ergebnisausdruck der CAST- oder CONVERT-Funktion an. Beispiel:

SELECT CAST('abc' AS varchar(5)) COLLATE French_CS_AS

Abschneiden und Runden von Ergebnissen

Werden Zeichenausdrücke oder binäre Ausdrücke (char, nchar, nvarchar, varchar, binary oder varbinary) in einen Ausdruck eines anderen Datentyps konvertiert, können die Daten abgeschnitten oder nur teilweise angezeigt werden, bzw. es wird ein Fehler zurückgegeben, da das Ergebnis zum Anzeigen zu kurz ist. Konvertierungen in char, varchar, nchar, nvarchar, binary und varbinary werden abgeschnitten, mit Ausnahme der in der folgenden Tabelle aufgelisteten Konvertierungen.

Ausgangsdatentyp

Zieldatentyp

Ergebnis

int, smallint oder tinyint

char

*

 

varchar

*

 

nchar

E

 

nvarchar

E

money, smallmoney, numeric, decimal, float oder real

char

E

 

varchar

E

 

nchar

E

 

nvarchar

E

* = Die Ergebnislänge ist zu kurz, um angezeigt zu werden. E = Es wird ein Fehler zurückgegeben, da die Ergebnislänge zu kurz ist, um angezeigt zu werden.

In SQL Server wird sichergestellt, dass nur reversible Konvertierungen (d. h. Konvertierungen, bei denen konvertierte Datentypen in den ursprünglichen Datentyp zurückkonvertiert werden können) von Version zu Version die gleichen Ergebnisse erzielen. Im folgenden Beispiel wird eine solche Hin- und Rückkonvertierung veranschaulicht:

DECLARE @myval decimal (5, 2);
SET @myval = 193.57;
SELECT CAST(CAST(@myval AS varbinary(20)) AS decimal(10,5));
-- Or, using CONVERT
SELECT CONVERT(decimal(10,5), CONVERT(varbinary(20), @myval));
HinweisHinweis

Versuchen Sie nicht, binary-Werte zu erstellen und sie dann in einen Datentyp der numerischen Datentypkategorie zu konvertieren. SQL Server garantiert nicht, dass das Ergebnis einer Datentypkonvertierung von decimal oder numeric in binary dem zwischen Versionen von SQL Server entspricht.

Im folgenden Beispiel ist der resultierende Ausdruck zu klein, um angezeigt zu werden.

USE AdventureWorks2012;
GO
SELECT p.FirstName, p.LastName, SUBSTRING(p.Title, 1, 25) AS Title, CAST(e.SickLeaveHours AS char(1)) AS [Sick Leave]
FROM HumanResources.Employee e JOIN Person.Person p ON e.BusinessEntityID = p.BusinessEntityID
WHERE NOT e.BusinessEntityID >5;

Dies ist das Resultset.

FirstName   LastName      Title   Sick Leave

---------   ------------- ------- --------

Ken         Sanchez       NULL   *

Terri       Duffy         NULL   *

Roberto     Tamburello    NULL   *

Rob         Walters       NULL   *

Gail        Erickson      Ms.    *

(5 row(s) affected)

Beim Konvertieren von Datentypen mit unterschiedlichen Dezimalstellen wird der Ergebniswert manchmal abgeschnitten und manchmal gerundet. In der folgenden Tabelle wird das Verhaltensmuster veranschaulicht.

Von

beispielsweise in

Verhalten

numeric

numeric

Round

numeric

int

Abschneiden

numeric

money

Round

money

int

Round

money

numeric

Round

float

int

Abschneiden

float

numeric

Round

Die Konvertierung der float-Werte, die eine wissenschaftliche Schreibweise für decimal oder numeric verwenden, ist auf Werte mit einer Genauigkeit von 17 Stellen beschränkt. Alle Werte mit einer Genauigkeit von mehr als 17 Stellen werden auf Null gerundet.

float

datetime

Round

datetime

int

Round

Das Ergebnis der Konvertierung im folgenden Beispiel ist beispielsweise 10:

SELECT CAST(10.6496 AS int);

Falls eine Konvertierung von Datentypen vorgenommen wird, bei der der Zieldatentyp weniger Dezimalstellen hat als der Quelldatentyp, wird der Wert abgeschnitten. Das Ergebnis der Konvertierung im folgenden Beispiel ist beispielsweise $10.3497:

SELECT CAST(10.3496847 AS money);

SQL Server gibt eine Fehlermeldung zurück, wenn nicht numerische char-, nchar-, varchar- oder nvarchar-Daten in int, float, numeric oder decimal konvertiert werden. SQL Server gibt außerdem einen Fehler zurück, wenn eine leere Zeichenfolge ("") in numeric oder decimal konvertiert wird.

Bestimmte datetime-Konvertierungen sind in SQL Server 2005 und neueren Versionen nicht deterministisch.

Konvertierungen von string in datetime werden in SQL Server 2000 als deterministisch markiert. Dies gilt jedoch nicht für die in der folgenden Tabelle aufgelisteten Formate. Bei diesen Formaten hängen die Konvertierungen von den Spracheinstellungen ab. In SQL Server 2005 und neueren Versionen werden diese Konvertierungen als nicht deterministisch markiert.

In der folgenden Tabelle sind die Formate aufgeführt, bei denen die Konvertierung von String in datetime nicht deterministisch ist.

Alle Formate unter 1001

106

107

109

113

130

1 Mit Ausnahme der Formate 20 und 21

Ergänzende Zeichen (Ersatzpaare)

Wenn Sie beginnend in SQL Server 2012 Sortierungen ergänzender Zeichen verwenden, wird ein CAST-Vorgang von nchar oder nvarchar zu einem nchar- oder nvarchar-Typ von geringerer Länge in einem Ersatzzeichenpaar nicht abgeschnitten. Er wird vor dem ergänzenden Zeichen abgeschnitten. Beispielsweise belässt das folgende Codefragment @x und enthält nur 'ab'. Es ist nicht genügend Raum für das ergänzende Zeichen vorhanden.

DECLARE @x NVARCHAR(10) = 'ab' + NCHAR(0x10000);
SELECT CAST (@x AS NVARCHAR(3));

Bei SC-Sortierungen entspricht das Verhalten von CONVERT dem von CAST.

Kompatibilitätsunterstützung

In früheren Versionen von SQL Server ist das Standardformat für CAST- und CONVERT-Vorgänge bei den Datentypen time und datetime2 121, sofern keiner der Typen im Ausdruck einer berechneten Spalte verwendet wird. Für berechnete Spalten ist das Standardformat 0. Dieses Verhalten wirkt sich auf berechnete Spalten aus, wenn sie erstellt werden und in Abfragen mit automatischer Parametrisierung oder in Einschränkungsdefinitionen verwendet werden.

Unter dem Kompatibilitätsgrad 110 ist das Standardformat für CAST- und CONVERT-Vorgänge im Fall der Datentypen time und datetime2 immer 121. Basiert die Abfrage auf dem alten Verhalten, verwenden Sie einen Kompatibilitätsgrad unter 110, oder geben Sie in der betroffenen Abfrage explizit das Format 0 an.

Ein Update der Datenbank auf Kompatibilitätsgrad 110 ändert keine Benutzerdaten, die auf dem Datenträger gespeichert wurden. Sie müssen diese Daten entsprechend manuell korrigieren. Haben Sie beispielsweise SELECT INFO zum Erstellen einer Tabelle von einer Quelle verwendet, die einen Ausdruck für eine berechnete Spalte (oben beschrieben) beinhaltete, werden die Daten mit dem Format 0 anstelle der Definition der berechneten Spalte an sich gespeichert. Sie müssen diese Daten manuell aktualisieren, um sie an das Format 121 anzupassen.

Beispiele

A.Verwenden von CAST und CONVERT

In jedem der Beispiele werden die Namen der Produkte abgerufen, deren Listenpreis mit der Ziffer 3 beginnt. Der ListPrice-Wert wird in einen int-Wert konvertiert.

-- Use CAST
USE AdventureWorks2012;
GO
SELECT SUBSTRING(Name, 1, 30) AS ProductName, ListPrice
FROM Production.Product
WHERE CAST(ListPrice AS int) LIKE '3%';
GO

-- Use CONVERT.
USE AdventureWorks2012;
GO
SELECT SUBSTRING(Name, 1, 30) AS ProductName, ListPrice
FROM Production.Product
WHERE CONVERT(int, ListPrice) LIKE '3%';
GO

B.Verwenden von CAST mit arithmetischen Operatoren

Im folgenden Beispiel wird eine einzelne Spalte (Computed) berechnet. Hierbei wird der aufgelaufene Jahresumsatz (SalesYTD) durch den Prozentsatz der Umsatzbeteiligung (CommissionPCT) geteilt. Dieses Ergebnis wird in einen int-Datentyp konvertiert, nachdem es auf die nächste ganze Zahl gerundet wurde.

USE AdventureWorks2012;
GO
SELECT CAST(ROUND(SalesYTD/CommissionPCT, 0) AS int) AS Computed
FROM Sales.SalesPerson 
WHERE CommissionPCT != 0;
GO

Dies ist das Resultset.

Computed

------

379753754

346698349

257144242

176493899

281101272

0

301872549

212623750

298948202

250784119

239246890

101664220

124511336

97688107

(14 row(s) affected)

C.Verwenden von CAST zur Verkettung

Im folgenden Beispiel werden nicht auf Zeichen basierende, nicht binäre Ausdrücke mithilfe von CAST verkettet.

USE AdventureWorks2012;
GO
SELECT 'The list price is ' + CAST(ListPrice AS varchar(12)) AS ListPrice
FROM Production.Product
WHERE ListPrice BETWEEN 350.00 AND 400.00;
GO

Dies ist das Resultset.

ListPrice

------------------

The list price is 357.06

The list price is 364.09

The list price is 364.09

The list price is 364.09

The list price is 364.09

(5 row(s) affected)

D.Verwenden von CAST zur Herstellung von besser lesbarem Text

Im folgenden Beispiel wird CAST in der SELECT-Liste verwendet, um die Name-Spalte in eine char(10)-Spalte zu konvertieren.

USE AdventureWorks2012;
GO
SELECT DISTINCT CAST(p.Name AS char(10)) AS Name, s.UnitPrice
FROM Sales.SalesOrderDetail AS s 
JOIN Production.Product AS p 
    ON s.ProductID = p.ProductID
WHERE Name LIKE 'Long-Sleeve Logo Jersey, M';
GO

Dies ist das Resultset.

Name       UnitPrice

---------- ---------------------

Long-Sleev 31.2437

Long-Sleev 32.4935

Long-Sleev 49.99

(3 row(s) affected)

E.Verwenden von CAST mit der LIKE-Klausel

Im folgenden Beispiel wird die money-Spalte SalesYTD in eine int-Spalte und anschließend in eine char(20)-Spalte konvertiert, sodass sie mit der LIKE-Klausel verwendet werden kann.

USE AdventureWorks2012;
GO
SELECT p.FirstName, p.LastName, s.SalesYTD, s.BusinessEntityID
FROM Person.Person AS p 
JOIN Sales.SalesPerson AS s 
    ON p.BusinessEntityID = s.BusinessEntityID
WHERE CAST(CAST(s.SalesYTD AS int) AS char(20)) LIKE '2%';
GO

Dies ist das Resultset.

FirstName        LastName            SalesYTD         SalesPersonID

---------------- ------------------- ---------------- -------------

Tsvi             Reiter              2811012.7151      279

Syed             Abbas               219088.8836       288

Rachel           Valdez              2241204.0424      289

(3 row(s) affected)

F.Verwenden von CONVERT oder CAST mit typisierter XML

In den folgenden Beispielen wird die Konvertierung in typisierte XML-Daten mithilfe von CONVERT und mit dem XML-Datentyp und -Spalten (SQL Server) dargestellt.

In diesem Beispiel wird eine aus Leerzeichen, Text und Markup bestehende Zeichenfolge in typisierte XML-Daten konvertiert und alle bedeutungslosen Leerzeichen (Leerzeichen an der Grenze zwischen Knoten) entfernt.

CONVERT(XML, '<root><child/></root>')

In diesem Beispiel wird eine ähnliche, aus Leerzeichen, Text und Markup bestehende Zeichenfolge in typisierte XML-Daten konvertiert und alle bedeutungslosen Leerzeichen (Leerzeichen an der Grenze zwischen Knoten) beibehalten.

CONVERT(XML, '<root>          <child/>         </root>', 1)

In diesem Beispiel wird eine aus Leerzeichen, Text und Markup bestehende Zeichenfolge in typisierte XML-Daten umgewandelt:

CAST('<Name><FName>Carol</FName><LName>Elliot</LName></Name>'  AS XML)

Weitere Beispiele finden Sie unter Erstellen von Instanzen der XML-Daten.

G.Verwenden von CAST und CONVERT mit datetime-Daten

Im folgenden Beispiel werden das aktuelle Datum und die aktuelle Uhrzeit dargestellt. CAST wird verwendet, um das aktuelle Datum und die aktuelle Uhrzeit in einen Zeichendatentyp zu ändern. Anschließend wird CONVERT verwendet, um das Datum und die Uhrzeit im ISO 8901-Format anzuzeigen.

SELECT 
   GETDATE() AS UnconvertedDateTime,
   CAST(GETDATE() AS nvarchar(30)) AS UsingCast,
   CONVERT(nvarchar(30), GETDATE(), 126) AS UsingConvertTo_ISO8601  ;
GO

Dies ist das Resultset.

UnconvertedDateTime     UsingCast                      UsingConvertTo_ISO8601

----------------------- ------------------------------ ------------------------------

2006-04-18 09:58:04.570 Apr 18 2006 9:58AM            2006-04-18T09:58:04.570

(1 row(s) affected)

Das folgende Beispiel entspricht in etwa der Umkehrung des vorherigen Beispiels. In dem Beispiel werden ein Datum und eine Uhrzeit als Zeichendaten angezeigt, und CAST wird verwendet, um die Zeichendaten in datetime-Datentypen zu ändern. Anschließend wird CONVERT verwendet, um die Zeichendaten in den datetime-Datentyp zu ändern.

SELECT 
   '2006-04-25T15:50:59.997' AS UnconvertedText,
   CAST('2006-04-25T15:50:59.997' AS datetime) AS UsingCast,
   CONVERT(datetime, '2006-04-25T15:50:59.997', 126) AS UsingConvertFrom_ISO8601 ;
GO

Dies ist das Resultset.

UnconvertedText         UsingCast               UsingConvertFrom_ISO8601

----------------------- ----------------------- ------------------------

2006-04-25T15:50:59.997 2006-04-25 15:50:59.997 2006-04-25 15:50:59.997

(1 row(s) affected)

H.Verwenden von CONVERT mit Binär- und Zeichendaten

Die folgenden Beispiele zeigen die Ergebnisse der Konvertierung von Binär- und Zeichendaten mit verschiedenen Formaten.

--Convert the binary value 0x4E616d65 to a character value.
SELECT CONVERT(char(8), 0x4E616d65, 0) AS [Style 0, binary to character];

Dies ist das Resultset.

Style 0, binary to character

----------------------------

Name

(1 row(s) affected)

--The following example shows how Style 1 can force the result
--to be truncated. The truncation is caused by
--including the characters 0x in the result.
SELECT CONVERT(char(8), 0x4E616d65, 1) AS [Style 1, binary to character];

Dies ist das Resultset.

Style 1, binary to character

------------------------------

0x4E616D

(1 row(s) affected)

--The following example shows that Style 2 does not truncate the
--result because the characters 0x are not included in
--the result.
SELECT CONVERT(char(8), 0x4E616d65, 2) AS [Style 2, binary to character];

Dies ist das Resultset.

Style 2, binary to character

------------------------------

4E616D65

(1 row(s) affected)

--Convert the character value 'Name' to a binary value.
SELECT CONVERT(binary(8), 'Name', 0) AS [Style 0, character to binary];

Dies ist das Resultset.

Style 0, character to binary

----------------------------------

0x4E616D6500000000

(1 row(s) affected)

SELECT CONVERT(binary(4), '0x4E616D65', 1) AS [Style 1, character to binary];

Dies ist das Resultset.

Style 1, character to binary

----------------------------------

0x4E616D65

(1 row(s) affected)

SELECT CONVERT(binary(4), '4E616D65', 2) AS [Style 2, character to binary];

Dies ist das Resultset.

Style 2, character to binary

----------------------------------

0x4E616D65

(1 row(s) affected)

I.Konvertieren der Datumstypen date und time

Das folgende Beispiel zeigt die Konversion der Datentypen date, time und datetime.

DECLARE @d1 date, @t1 time, @dt1 datetime;
SET @d1 = GETDATE();
SET @t1 = GETDATE();
SET @dt1 = GETDATE();
SET @d1 = GETDATE();
-- When converting date to datetime the minutes portion becomes zero.
SELECT @d1 AS [date], CAST (@d1 AS datetime) AS [date as datetime];
-- When converting time to datetime the date portion becomes zero 
-- which converts to January 1, 1900.
SELECT @t1 AS [time], CAST (@t1 AS datetime) AS [time as datetime];
-- When converting datetime to date or time non-applicable portion is dropped.
SELECT @dt1 AS [datetime], CAST (@dt1 AS date) AS [datetime as date], CAST (@dt1 AS time) AS [datetime as time];

Siehe auch

Verweis

SELECT (Transact-SQL)

Systemfunktionen (Transact-SQL)

Konzepte

Datentypkonvertierung (Datenbankmodul)

Schreiben internationaler Transact-SQL-Anweisungen