Database.Guide

Misschien bent u de T-SQL PARSE(), CAST(), en CONVERT() functies tegengekomen bij het werken met SQL Server en hebt u zich afgevraagd wat het verschil is. Alle drie de functies lijken hetzelfde te doen, maar er zijn subtiele verschillen tussen hen.

In dit artikel wil ik de belangrijkste verschillen tussen deze functies schetsen.

Vergelijking

Hier vindt u een tabel waarin de belangrijkste verschillen tussen de CONVERT(), CAST(), en PARSE() functies in SQL Server worden geschetst:

CONVERT() CAST() PARSE()
Officiële definitie Converteert een uitdrukking van het ene gegevenstype naar een ander. Omzet een uitdrukking van het ene gegevenstype in een ander. Retourneert het resultaat van een uitdrukking, vertaald naar het gevraagde gegevenstype in SQL Server.
Accepted Value Elke geldige uitdrukking. Elke geldige uitdrukking. String.
Return Value 2e argument, vertaald naar het gevraagde datatype zoals opgegeven door het 1e argument. 1e argument, vertaald naar het gevraagde gegevenstype zoals verstrekt door het 2e argument. 1e argument, vertaald naar het gevraagde gegevenstype zoals verstrekt door het 2e argument. 1e argument, vertaald naar het gevraagde gegevenstype zoals verstrekt door het 2e argument.
Ondersteunde Conversies Tussen twee willekeurige gegevenstypen. Uitsluitend van string naar datum/tijd en getaltypen.
Accepteert het stijlargument? Ja. Nee. Nee.
Vaccepteert het cultuur-argument? Nee. Nee. Ja.
Heeft .NET Framework nodig? Nee. Nee. Ja.

Enige andere punten in aanvulling op de bovenstaande tabel:

  • De Microsoft documentatie wijst erop dat PARSE() niet zal worden geremote (omdat het afhankelijk is van de aanwezigheid van de CLR). Het remoten van een functie die de CLR vereist zou een fout op de server op afstand veroorzaken.
  • Er zijn sommige waarden die PARSE() wel aankan, maar CAST() en CONVERT() niet (bijvoorbeeld strings die bepaalde datumformaten gebruiken).
  • CAST() is opgenomen in de ANSI SQL-92 standaard.
  • Sommigen beweren dat CAST() betere prestaties levert dan de andere twee.
  • Er is een zekere prestatie-overhead bij het parseren van string-waarden. Daarom zal PARSE() meestal langzamer werken dan de andere twee.

Hieronder staan voorbeelden van situaties waarin elke functie het meest geschikt zou zijn.

Wanneer CAST()

Er zou een goed argument gemaakt kunnen worden om CAST() te gebruiken voor elk scenario dat hieronder niet wordt genoemd. Zoals gezegd, CAST() maakt sinds SQL-92 deel uit van de ANSI SQL-standaard, dus het zou beter overdraagbaar moeten zijn tussen verschillende DBMS’en (als dat een vereiste is).

Ook beweren sommigen dat CAST() beter presteert dan de andere twee (hier is een interessant artikel dat de prestaties tussen de drie functies vergelijkt).

Er zijn echter ook geldige redenen waarom u CONVERT() boven CAST() zou kunnen verkiezen (of nodig zou kunnen hebben).

Wanneer CONVERT()

De functie CONVERT() kan van pas komen wanneer u het argument style moet gebruiken om aan te geven hoe de datum moet worden geformatteerd wanneer u converteert tussen een datum en een tekenreeks. Hier zijn enkele voorbeelden:

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';

Resultaat:

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

U kunt dit alleen doen met CONVERT() omdat:

  • CAST() ondersteunt het style argument niet; en
  • PARSE() converteert niet van een datum/tijd naar een string waarde (het ondersteunt ook het style argument niet)

Wanneer PARSE()

Ondanks de verschillende nadelen van deze functie (performance, afhankelijkheid van .NET, beperkte datatype conversies), heeft het ook enkele voordelen, en er zijn enkele scenario’s waarin het je enige keuze zou kunnen zijn. Bijvoorbeeld wanneer u een datum opgeeft die de naam van de weekdag bevat, zoals vrijdag 20 juli 2018.

Wanneer de anderen een fout retourneren

Hier zijn voorbeelden waarbij PARSE() de enige functie van de drie is die de waarde met succes kan converteren zonder een fout te gooien.

In deze voorbeelden proberen we verschillende tekenreekswaarden te converteren naar een datatype. De string-waarden die we opgeven bevatten echter de naam van de weekdag. Dit veroorzaakt problemen voor CAST() en CONVERT(), maar PARSE() heeft geen probleem.

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';

Resultaat:

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

Dus PARSE() heeft geen probleem met het formaat van de datum die we opgeven.

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';

Resultaat:

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

Dus CONVERT() is niet in staat om de string te converteren wanneer deze een dergelijk formaat heeft.

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';

Resultaat:

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

En CAST() geeft dezelfde foutmelding.

Dus als u fouten krijgt met de andere twee functies, probeer PARSE() in plaats daarvan.

Specifieer de Cultuur

Een ander scenario waarin u de voorkeur zou kunnen geven aan de PARSE() functie is bij het specificeren van de cultuur/taal waarin de string is aangeleverd. PARSE() heeft een optioneel argument waarmee u kunt specificeren welke cultuur moet worden gebruikt. Indien weggelaten, wordt de taal van de huidige sessie gebruikt.

Voorbeeld van het opnemen van het 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';

Resultaat:

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

Een Cultuur Alternatief

Ondanks het voordeel van het kunnen specificeren van de cultuur met PARSE(), heeft u wel de mogelijkheid om de taal instellingen te veranderen, wat betekent dat u hetzelfde effect zou kunnen bereiken met CAST() of CONVERT().

Bijv. gebruik van SET LANGUAGE us_english voor de query verandert de huidige taalinstelling in us_english. Hoewel dit niet toestaat dat u verschillende culturen specificeert binnen de query (zoals in het bovenstaande voorbeeld), heeft het wel invloed op de gehele query (en eventuele volgende queries).

U kunt ook de datum formaat instellingen op dezelfde manier wijzigen. Bijvoorbeeld SET DATEFORMAT mdy.

Hier volgt een voorbeeld van het veranderen van de taalinstelling voordat u een query met CAST() en CONVERT() uitvoert:

Duits:

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

Resultaat:

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

us_engels:

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

Resultaat:

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

Onthoud, als je dit doet, verander je de taal/datum formaat omgeving voor de sessie. Vergeet niet om het terug te veranderen!

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.