2016-07-14 9 views
1

Warum hat die folgende T-SQL-Anweisung:Warum führt MS SQL CAST als bigint zu Int-Überlauf?

select CAST(COALESCE('3537601039',0) as bigint) 

Ergebnis im Fehler folgenden, wenn sie gegen MS SQL Server 10 laufen?

Die Konvertierung des Varchar-Wertes '3537601039' übergelaufen eine int Spalte.

Gibt es eine „richtigere“ Weg, um diese Umwandlung eines varchar zu einem bigint zu tun, um dieses Problem zu vermeiden würde, wenn die Zahl in Reichweite eines bigint ist?

+2

Warum sind Sie 'COALESCE' mit statischen Nicht-Null-Werte trotzdem mit? –

+0

@DStanley - vererbtes System. Wenn ich aufhörte zu fragen "warum" mit allem, was ich finde, würde ich nicht in der Lage sein, es funktioniert zu halten;) – feetwet

+0

Nun, Sie könnten es herausnehmen und Ihnen wäre in Ordnung - 'wählen CAST ('3537601039' als bigint)' –

Antwort

2

Das erste, was passiert ist, dass die Zeichenfolge in eine reguläre int zu konvertieren versucht, die 0 übereinstimmen. versuchen Sie folgendes:

select CAST(COALESCE('3537601039','0') as bigint) 
2

Es scheint, dass die Eingabe der unqualifizierten Null in coalesce eine Konversion zu einem kleineren int bedeutet, bevor es explizit in eine bigint umformatiert wird.

Die folgende einfache Änderung es ein coalesce von String-Werte zu machen das Problem löst:

select CAST(COALESCE('3537601039','0') as bigint) 
2

Guss zuerst, dann tun ISNULL

select ISNULL(CAST('3537601039' as bigint), 0) 

select ISNULL(NULLIF(ISNULL(CAST('3537601039' as bigint), 0), 0), 1) + 3537601039 

sql server erkennt zuerst isnull(string, numeric), und die numerische Null ist standardmäßig int. Es versucht also, die Zeichenfolge, die bigint enthält, in int zu konvertieren. Du hast versucht, zu spät zu spielen.

ein weiterer Versuch:

select ISNULL('3537601039', 100000000000)