Einigen wird vielleicht aufgefallen sein, dass die Suchbox auf InsideSQL.org in den letzten Tagen nicht wie erwartet funktioniert hat.
Zwar wohne ich nicht mehr in Deutschland, dennoch möchte ich die Gelegenheit nutzen, um auf etwas aufmerksam zu machen, das mal so ganz und gar nichts mit dem Hauptthema dieser Website zu tun hat.
Wenn man Tabellen erstellt, Variablen deklariert oder andere Sachen macht, bei denen man mit Datentypen in Berührung kommt, sollte man stets präzise den Untertypen angegeben, den man verwenden möchte. Hier bringt es nichts ein Lazycoder zu sein, der ein paar Tastaturanschläge sparen will.
Beispiel 1: Wenn man eine VARCHAR Variable der Länge 10 deklarieren möchte, gibt man an
DECLARE @MyVar VARCHAR(10)
und nicht
DECLARE @MyVar VARCHAR
SQL Server nimmt standardmässig eine Länge von 1 für Zeichenfolgen, sofern man nicht explizit die Länge vorgibt. SQL Server schneidet ferner die Daten ab, ohne eine Warnung auszugeben:
DECLARE @MyVar VARCHAR SET @MyVar = 'AB' SELECT @MyVar AS Only_one_character Only_one_character ------------------ A (1 row(s) affected)
Beispiel 2: Man möchte eine Variable vom Typ DECIMAL mit einer Precision von 8 und Scale von 2 deklarieren.
DECLARE MyVar DECIMAL(8,2)
Schreibt man hingegen
DECLARE @MyVar DECIMAL
unterstellt SQL Server hier den Datentyp DECIMAL(18,0).
DECLARE @MyVar DECIMAL SET @MyVar = 123456789012345678 SELECT @MyVar -------------------- 123456789012345678 (1 row(s) affected)
Im Unterschied jedoch zu Zeichenfolgen, generiert SQL Server eine Warnung, falls der Wert zu groß ist, um in einen DECIMAL(18,0) zu passen
DECLARE @MyVar DECIMAL SET @MyVar = 1234567890123456789 SELECT @MyVar Server: Msg 8115, Level 16, State 8, Line 2 Arithmetic overflow error converting numeric to data type numeric. -------------------- NULL (1 row(s) affected)
*****