Gibt es in T-SQL eine Möglichkeit, ein nvarchar in int umzuwandeln und einen Standardwert oder NULL zurückzugeben, wenn die Konvertierung fehlschlägt?
116
Verwenden Sie die Funktion TRY_CONVERT .
Erstellen Sie eine benutzerdefinierte Funktion. Dadurch werden die Probleme vermieden , die Fedor Hajdu in Bezug auf Währung, Bruchzahlen usw. erwähnt hat:
CREATE FUNCTION dbo.TryConvertInt(@Value varchar(18))
RETURNS int
AS
BEGIN
SET @Value = REPLACE(@Value, ',', '')
IF ISNUMERIC(@Value + 'e0') = 0 RETURN NULL
IF ( CHARINDEX('.', @Value) > 0 AND CONVERT(bigint, PARSENAME(@Value, 1)) <> 0 ) RETURN NULL
DECLARE @I bigint =
CASE
WHEN CHARINDEX('.', @Value) > 0 THEN CONVERT(bigint, PARSENAME(@Value, 2))
ELSE CONVERT(bigint, @Value)
END
IF ABS(@I) > 2147483647 RETURN NULL
RETURN @I
END
GO
-- Testing
DECLARE @Test TABLE(Value nvarchar(50)) -- Result
INSERT INTO @Test SELECT '1234' -- 1234
INSERT INTO @Test SELECT '1,234' -- 1234
INSERT INTO @Test SELECT '1234.0' -- 1234
INSERT INTO @Test SELECT '-1234' -- -1234
INSERT INTO @Test SELECT '$1234' -- NULL
INSERT INTO @Test SELECT '1234e10' -- NULL
INSERT INTO @Test SELECT '1234 5678' -- NULL
INSERT INTO @Test SELECT '123-456' -- NULL
INSERT INTO @Test SELECT '1234.5' -- NULL
INSERT INTO @Test SELECT '123456789000000' -- NULL
INSERT INTO @Test SELECT 'N/A' -- NULL
SELECT Value, dbo.TryConvertInt(Value) FROM @Test
Referenz: Ich habe diese Seite beim Erstellen meiner Lösung ausgiebig verwendet.
Ja :). Versuche dies:
ISNUMERIC()
hat ein paar Probleme von Fedor Hajdu .Es gibt true für Zeichenfolgen wie
$
(ist Währung),
oder.
(beide sind Trennzeichen)+
und zurück-
.quelle
ISNUMERIC
dass diese Antwort für nicht validierte Daten von Nutzen wäre (und Sie würden dieISNUMERIC
Prüfung für ordnungsgemäß validierte Daten gar nicht erst benötigen ). Der Autor erkennt die Existenz dieser Probleme an, geht jedoch nicht auf sie ein.TRY_CONVERT
/ verwendenTRY_CAST
, die ausdrücklich dazu bestimmt sind, die Frage des OP zu lösen. Diese Antwort wurde geschrieben, bevor SQL 2012 veröffentlicht wurde.Ich würde lieber eine Funktion wie TryParse erstellen oder T-SQL verwenden
TRY-CATCH
Block verwenden, um das zu erhalten, was Sie wollten.ISNUMERIC funktioniert nicht immer wie vorgesehen. Der zuvor angegebene Code schlägt fehl, wenn Sie Folgendes tun:
SET @text = '$'
$ sign kann in einen Money-Datentyp konvertiert werden,
ISNUMERIC()
gibt also in diesem Fall true zurück. Das Gleiche gilt für '-' (Minus), ',' (Komma) und '.' Zeichen.quelle
ISNUMERIC()
kehrt1
auch für,
und.
.Wie bereits erwähnt, können bei der Verwendung mehrere Probleme auftreten
ISNUMERIC
:Wenn Sie eine zuverlässige Konvertierung wünschen, müssen Sie selbst eine codieren.
Update : Meine neue Empfehlung wäre, eine Zwischentestkonvertierung zu verwenden
FLOAT
, um die Nummer zu validieren. Dieser Ansatz basiert auf dem Kommentar von adrianm . Die Logik kann als Inline-Tabellenwertfunktion definiert werden:Einige Tests:
Die Ergebnisse ähneln der Antwort von Joseph Sturtevant mit den folgenden Hauptunterschieden:
.
oder,
um das Verhalten nativerINT
Conversions nachzuahmen .'1,234'
und'1234.0'
zurückNULL
.'00000000000000001234'
bewertet zu12
. Das Erhöhen der Parameterlänge würde zu Fehlern bei überlaufenden Nummern führenBIGINT
, wie z. B. BBANs (Basis-Bankkontonummern) wie'212110090000000235698741'
.Zurückgezogen : Der folgende Ansatz wird nicht mehr empfohlen, da er nur als Referenz dient.
Das folgende Snippet funktioniert mit nicht negativen Ganzzahlen. Es wird überprüft, ob Ihre Zeichenfolge keine nichtstelligen Zeichen enthält, nicht leer ist und nicht überläuft (indem der Maximalwert für den
int
Typ überschritten wird ). Es gibt jedoch auchNULL
gültige Ganzzahlen an, deren Länge aufgrund führender Nullen 10 Zeichen überschreitet.Wenn Sie eine beliebige Anzahl führender Nullen unterstützen möchten, verwenden Sie die folgenden Schritte. Die verschachtelten
CASE
Anweisungen sind zwar unhandlich, müssen jedoch die Kurzschlussbewertung fördern und die Wahrscheinlichkeit von Fehlern verringern (z. B. durch Übergabe einer negativen Länge anLEFT
).Wenn Sie positive und negative Ganzzahlen mit einer beliebigen Anzahl führender Nullen unterstützen möchten :
quelle
Grüße.
Ich habe eine nützliche Skalarfunktion geschrieben, um die TRY_CAST-Funktion von SQL SERVER 2012 in SQL Server 2008 zu simulieren.
Sie können es im nächsten Link unten sehen und wir helfen uns gegenseitig, es zu verbessern. TRY_CAST-Funktion für SQL Server 2008 https://gist.github.com/jotapardo/800881eba8c5072eb8d99ce6eb74c8bb
Beispiel:
Unterstützt derzeit nur die Datentypen INT, DATE, NUMERIC, BIT und FLOAT
Ich hoffe, Sie finden es nützlich.
CODE:
quelle
Josephs Antwort wies darauf hin, dass ISNUMERIC auch wissenschaftliche Notationen wie '1.3e + 3' behandelt, aber seine Antwort behandelt dieses Zahlenformat nicht.
Das Casting auf ein Geld oder einen Float behandelt zunächst sowohl die Währung als auch wissenschaftliche Fragen:
Die Funktion schlägt fehl, wenn die Zahl größer als ein Bigint ist.
Wenn Sie einen anderen Standardwert zurückgeben möchten, lassen Sie diese Funktion generisch und ersetzen Sie anschließend die Null:
quelle
Ich weiß, dass es nicht schön ist, aber es ist einfach. Versuche dies:
quelle
Meine Lösung für dieses Problem bestand darin, die unten gezeigte Funktion zu erstellen. Zu meinen Anforderungen gehörte, dass die Zahl eine Standard-Ganzzahl und keine BIGINT sein musste und ich negative und positive Zahlen zulassen musste. Ich habe keinen Umstand gefunden, in dem dies fehlschlägt.
quelle