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

PARSE() vs. CAST() vs. CONVERT() in SQL Server:Was ist der Unterschied?

Vielleicht sind Sie schon einmal auf das T-SQL PARSE() gestoßen , CAST() , und CONVERT() Funktionen bei der Arbeit mit SQL Server und fragte mich, was der Unterschied ist. Alle drei Funktionen scheinen dasselbe zu tun, aber es gibt subtile Unterschiede zwischen ihnen.

In diesem Artikel möchte ich die Hauptunterschiede zwischen diesen Funktionen skizzieren.

Vergleich

In der folgenden Tabelle sind die Hauptunterschiede zwischen CONVERT() aufgeführt , CAST() , und PARSE() Funktionen in SQL Server:

CONVERT() CAST() PARSE()
Offizielle Definition Konvertiert einen Ausdruck eines Datentyps in einen anderen. Konvertiert einen Ausdruck eines Datentyps in einen anderen. Gibt das Ergebnis eines Ausdrucks zurück, übersetzt in den angeforderten Datentyp in SQL Server.
Akzeptierter Wert Jeder gültige Ausdruck. Jeder gültige Ausdruck. Zeichenfolge.
Rückgabewert 2. Argument, übersetzt in den angeforderten Datentyp, wie vom 1. Argument angegeben. 1. Argument, übersetzt in den angeforderten Datentyp, wie vom 2. Argument angegeben. 1. Argument, übersetzt in den angeforderten Datentyp, wie vom 2. Argument angegeben.
Unterstützte Konvertierungen Zwischen zwei beliebigen Datentypen. Zwischen zwei beliebigen Datentypen. Von Zeichenkette bis Datum/Uhrzeit und nur Zahlentypen.
Akzeptiert den Stil Argument? Ja. Nein. Nein.
Akzeptiert die Kultur Argument? Nein. Nein. Ja.
Erfordert .NET Framework? Nein. Nein. Ja.

Einige andere Punkte zusätzlich zu der obigen Tabelle:

  • Die Microsoft-Dokumentation weist darauf hin, dass PARSE() wird nicht entfernt (da dies vom Vorhandensein der CLR abhängt). Das Remoting einer Funktion, die die CLR erfordert, würde einen Fehler auf dem Remoteserver verursachen.
  • Es gibt einige Werte, die PARSE() werden kann aber mit CAST() umgehen und CONVERT() kann nicht (z. B. Zeichenfolgen mit bestimmten Datumsformaten).
  • CAST() ist im ANSI SQL-92-Standard enthalten.
  • Einige argumentieren, dass CAST() hat eine bessere Leistung als die anderen beiden.
  • Beim Analysieren von Zeichenfolgenwerten gibt es einen gewissen Leistungsaufwand. Daher PARSE() läuft normalerweise langsamer als die anderen beiden.

Nachfolgend finden Sie Beispiele für Situationen, in denen die einzelnen Funktionen am besten geeignet sind.

Wann CAST() verwendet werden sollte

Ein gutes Argument könnte für die Verwendung von CAST() angeführt werden für jedes Szenario, das unten nicht aufgeführt ist. Wie bereits erwähnt, CAST() ist seit SQL-92 Teil des ANSI-SQL-Standards, daher sollte es besser zwischen verschiedenen DBMSs portierbar sein (falls dies erforderlich ist).

Einige argumentieren auch, dass CAST() hat eine bessere Leistung als die anderen beiden (hier ist ein interessanter Artikel, der die Leistung aller drei Funktionen vergleicht).

Es gibt jedoch auch triftige Gründe, warum Sie die Verwendung von CONVERT() bevorzugen (oder müssen). über CAST() .

Wann CONVERT() verwendet werden sollte

Das CONVERT() Funktion kann sich als nützlich erweisen, wenn Sie den style verwenden müssen -Argument, um anzugeben, wie das Datum formatiert werden soll, wenn zwischen einem Datum und einer Zeichenfolge konvertiert wird. Hier sind einige Beispiele:

DECLARE @date datetime2 = '2018-06-07 02:35:52.8537677';
SELECT
    CONVERT(nvarchar(30), @date, 100) AS '100',
    CONVERT(nvarchar(30), @date, 101) AS '101',
    CONVERT(nvarchar(30), @date, 102) AS '102',
    CONVERT(nvarchar(30), @date, 103) AS '103';

Ergebnis:

+---------------------+------------+------------+------------+
| 100                 | 101        | 102        | 103        |
|---------------------+------------+------------+------------|
| Jun  7 2018  2:35AM | 06/07/2018 | 2018.06.07 | 07/06/2018 |
+---------------------+------------+------------+------------+

Das geht nur mit CONVERT() weil:

  • CAST() unterstützt den style nicht Streit; und
  • PARSE() konvertiert nicht von einem Datum/einer Uhrzeit in einen Zeichenfolgenwert (es unterstützt auch nicht den style Argument)

Wann sollte PARSE() verwendet werden

Trotz der verschiedenen Nachteile dieser Funktion (Leistung, Abhängigkeit von .NET, begrenzte Datentypkonvertierungen) hat sie auch einige Vorteile, und es gibt einige Szenarien, in denen sie Ihre einzige Wahl sein könnte. Wenn Sie beispielsweise ein Datum angeben, das den Namen des Wochentags enthält, wie Freitag, 20. Juli 2018 .

Wenn die Anderen einen Fehler zurückgeben

Hier sind Beispiele, bei denen PARSE() ist die einzige der drei Funktionen, die den Wert erfolgreich umwandeln kann, ohne einen Fehler auszulösen.

In diesen Beispielen versuchen wir, verschiedene Zeichenfolgenwerte in ein Datum umzuwandeln Datentyp. Die von uns bereitgestellten Zeichenfolgenwerte enthalten jedoch den Namen des Wochentags. Dies verursacht Probleme für CAST() und CONVERT() , aber PARSE() kein Problem.

PARSE()

SELECT 
    PARSE('Friday, 20 July 2018' AS date) AS 'Result 1',
    PARSE('Fri, 20 July 2018' AS date) AS 'Result 2',
    PARSE('Friday 20 July 2018' AS date) AS 'Result 3';

Ergebnis:

+------------+------------+------------+
| Result 1   | Result 2   | Result 3   |
|------------+------------+------------|
| 2018-07-20 | 2018-07-20 | 2018-07-20 |
+------------+------------+------------+

Also PARSE() hat kein Problem mit dem Datumsformat, das wir bereitstellen.

CONVERT()

SELECT 
    CONVERT(date, 'Friday, 20 July 2018') AS 'Result 1',
    CONVERT(date, 'Fri, 20 July 2018') AS 'Result 2',
    CONVERT(date, 'Friday 20 July 2018') AS 'Result 3';

Ergebnis:

Conversion failed when converting date and/or time from character string.

Also CONVERT() kann die Zeichenfolge nicht konvertieren, wenn sie in einem solchen Format vorliegt.

CAST()

SELECT 
    CAST('Friday, 20 July 2018' AS date) AS 'Result 1',
    CAST('Fri, 20 July 2018' AS date)AS 'Result 2',
    CAST('Friday 20 July 2018' AS date) AS 'Result 3';

Ergebnis:

Conversion failed when converting date and/or time from character string.

Und CAST() gibt denselben Fehler zurück.

Wenn Sie also feststellen, dass Sie Fehler mit den anderen beiden Funktionen erhalten, versuchen Sie es mit PARSE() stattdessen.

Kultur angeben

Ein weiteres Szenario, in dem Sie möglicherweise lieber PARSE() verwenden Funktion ist, wenn die Kultur/Sprache angegeben wird, in der die Zeichenfolge bereitgestellt wird. PARSE() verfügt über ein optionales Argument, mit dem Sie angeben können, welche Kultur verwendet werden soll. Wenn weggelassen, wird die Sprache der aktuellen Sitzung verwendet.

Beispiel für die Einbeziehung von culture Argument:

SELECT 
    PARSE('07/01/2018' AS date USING 'en-US') AS 'Result 1',
    PARSE('07/01/2018' AS date USING 'de-DE') AS 'Result 2';

Ergebnis:

+------------+------------+
| Result 1   | Result 2   |
|------------+------------|
| 2018-07-01 | 2018-01-07 |
+------------+------------+

Eine kulturelle Alternative

Trotz des Vorteils, die Kultur mit PARSE() angeben zu können haben Sie die Möglichkeit, die Spracheinstellungen zu ändern, was bedeutet, dass Sie den gleichen Effekt erzielen könnten, wenn Sie CAST() verwenden oder CONVERT() .

Verwenden Sie beispielsweise SET LANGUAGE us_english vor der Abfrage ändert die aktuellen Spracheinstellungen auf us_english . Dies erlaubt Ihnen zwar nicht, verschiedene Kulturen innerhalb der Abfrage anzugeben (wie im obigen Beispiel), wirkt sich jedoch auf die gesamte Abfrage (und alle nachfolgenden Abfragen) aus.

Auf die gleiche Weise können Sie auch die Einstellungen für das Datumsformat ändern. Beispiel:SET DATEFORMAT mdy .

Hier ist ein Beispiel für das Ändern der Spracheinstellung vor dem Ausführen einer Abfrage mit CAST() und CONVERT() :

Deutsch:

SET LANGUAGE German;
SELECT CONVERT(date, '07/01/2018') AS 'Convert';
SELECT CAST('07/01/2018' AS date) AS 'Cast';

Ergebnis:

+------------+
| Convert    |
|------------|
| 2018-01-07 |
+------------+
Die Spracheneinstellung wurde in Deutsch geändert.
+------------+
| Cast       |
|------------|
| 2018-01-07 |
+------------+

us_english:

SET LANGUAGE us_english;
SELECT CONVERT(date, '07/01/2018') AS 'Convert';
SELECT CAST('07/01/2018' AS date) AS 'Cast';

Ergebnis:

+------------+
| Convert    |
|------------|
| 2018-07-01 |
+------------+
Changed language setting to us_english.
+------------+
| Cast       |
|------------|
| 2018-07-01 |
+------------+

Denken Sie daran, dass Sie dabei die Sprach-/Datumsformatumgebung für die Sitzung ändern. Vergessen Sie nicht, es wieder zu ändern!