Overblog Folge diesem Blog
Edit post Administration Create my blog
Blog von Olaf Helper

CONVERT liefert Sternchen (Asterisk *)

6. Oktober 2009 , Geschrieben von Olaf Helper Veröffentlicht in #T-SQL

Wenn man versucht einen Text, der keine gültige Zahl darstellt, in eine Zahl zu konvertieren, gibt es einen Laufzeitfehler; ist klar.

 SELECT CONVERT(int, 'Text') AS Try 
 Meldung 245, Ebene 16, Status 1, Zeile 1 
 Fehler beim Konvertieren des varchar-Wertes 'Text' in den int-Datentyp. 

 

Wie sieht es mit der „Gegenrichtung“ aus, kann man nach belieben nach VarChar konvertieren, sofern der Datentyp + CONVERT es prinzipiell unterstützt?

 

Datum ist jedenfalls kein Problem, auch wenn ich das Ergebnis mit VarChar auf 3 Zeichen begrenze; bekomme ich halt den Tag und den ersten Punkt zurück.

 SELECT CONVERT(varchar(3), GetDate(), 104) AS Datum 
 Datum 
 ----- 
 06. 

 

Wenn ich nun Numeric umwandeln will, sieht es schon anders aus.

 SELECT CONVERT(varchar(4), 1234.567) AS Fliess 
 Fliess 
 ------ 
 Meldung 8115, Ebene 16, Status 5, Zeile 1 
 Arithmetischer Überlauffehler beim Konvertieren von numeric in den varchar-Datentyp. 


Die Konvertierung kann die Zahl mit 4 Zeichen nicht vollständig umwandeln und sie schlägt deshalb fehl; mit VarChar(8) würde es gehen. Gleiches geschieht auch bei GUID, es werden die benötigte Anzahl an Zeichen erwartet.

 

Damit wäre ja alles klar … oder doch nicht?

Ein weitere Versuch mit Ganzzahlen smallint / int:

 

 -- Substitute auf * (Sternchen, Asterisk) 
 SELECT Zahl 
   ,CONVERT(varchar(2), Zahl) AS Str2 
   ,CONVERT(varchar(3), Zahl) AS Str3 
   ,SUBSTRING(CONVERT(varchar(6), Zahl), 1, 2) AS Sub2 
 FROM (SELECT CONVERT(smallint, 1) AS Zahl 
   UNION ALL SELECT 10 
   UNION ALL SELECT 100 
   UNION ALL SELECT 1000) AS Quelle 
   
 Ergebnis: 
   
 Zahl  Str2 Str3 Sub2 
 ----------- ---- ---- ---- 
 1  1  1  1 
 10  10  10  10 
 100  *  100  10 
 1000  *  *  10 

 

Kein Laufzeitfehler, dafür findet man im Ergebnis nun plötzlich Sternchens * wieder (getestet mit MS SQL Server 2000, 2005, 2008 und 2008 R2 CTP). Verwendet man hingegen NVarChar, gibt es auf einmal einen Laufzeitfehler; nicht sehr konsequent.

Wenn man in der BOL dann unter „CAST und CONVERT (Transact-SQL)“ nachsieht, findet man das auch genau so im Absatz „Abschneiden und Runden von Ergebnissen“ dokumentiert.

Muss man halt nur wissen, sonst wundert man sich über das Ergebnis.

Diesen Post teilen

Repost 0

Kommentiere diesen Post