2017-08-30 3 views
1

Unten Teil meiner Abfrage versagte zunächst:Was sind alle Werte, die ISNUMERIC-Funktion in SQL Server als TRUE findet?

WHEN ISNUMERIC(npx.nvcAnswer) = 1 
      THEN CASE 
      WHEN ABS(CONVERT(DECIMAL(38,2),npx.nvcAnswer)) < 1 
      THEN CONVERT(VARCHAR,CONVERT(DECIMAL(38,2),npx.nvcAnswer)) 
      ELSE npx.nvcAnswer 
      END 

Unterhalb der Fehler war, dass wir waren immer:

com.microsoft.sqlserver.jdbc.SQLServerException: Fehlerdatentyp nvarchar in numerische Umwandlung. rootCause = SQLException # 1: errorCode: 8114 sqlState: S0005 message: Fehler beim Konvertieren des Datentyps nvarchar in numeric.

Ich erkannte, dass es zu '.' & '-' als NUMERIC hält.

Also fügte ich "NOT npx.nvcAnswer in('.' , '-')" hinzu und es funktionierte.

WHEN ISNUMERIC(npx.nvcAnswer) = 1 AND NOT npx.nvcAnswer in('.' , '-') 
    THEN CASE 
    WHEN ABS(CONVERT(DECIMAL(38,2),npx.nvcAnswer)) < 1 
    THEN CONVERT(VARCHAR,CONVERT(DECIMAL(38,2),npx.nvcAnswer)) 
    ELSE npx.nvcAnswer 
    END 

Nach einem Tag begann es wieder mit Fehler unten zu versagen.

com.microsoft.sqlserver.jdbc.SQLServerException: Fehler beim Konvertieren des Datentyps nvarchar in numerisch. rootCause = SQLException # 1: errorCode: 8114 sqlState: S0005 message: Fehler beim Konvertieren des Datentyps nvarchar in numeric.

Dann änderte ich unten Block und es funktionierte: (Aber ich nicht finden, welche Werte dieses Problem verursacht wurden)

OLD:

WHEN ABS(CONVERT(DECIMAL(38,2),npx.nvcAnswer)) < 1 
    THEN CONVERT(VARCHAR,CONVERT(DECIMAL(38,2),npx.nvcAnswer)) 

NEU:

WHEN ABS(CONVERT(DECIMAL(38,2),PATINDEX('%[^0-9]%', npx.nvcAnswer))) < 1 
    THEN CONVERT(VARCHAR,CONVERT(DECIMAL(38,2),PATINDEX('%[^0-9]%', npx.nvcAnswer))) 

Fragen Sie:

Was sind alle Werte, die die ISNUMERIC-Funktion in SQL Server als TRUE findet?

+1

zu lange Liste. I.e. Einige sind nur in bestimmten Kombinationen gültig, wie zum Beispiel "1d1". Sie sollten stattdessen, wie Sie es getan haben, eine Whitelist von Zeichen verwenden, von denen Sie glauben, dass sie gültig sind. 'ISNUMERIC' beantwortet die Frage, die niemand jemals stellen wollte -" kann diese Zeichenkette in * alle * der numerischen Datentypen umgewandelt werden (es ist mir egal * welcher * Typ (en), in den sie konvertiert werden kann)? " –

Antwort

-1

Ich schlage vor, Sie sollten Ihre Try_Cast() - Funktion anstelle der Verwendung komplexer Logik, um numerische Werte zu überprüfen.

ISNUMERIC gibt 1 für einige Zeichen zurück, die keine Zahlen sind, wie Plus (+), Minus (-) und gültige Währungssymbole wie das Dollarzeichen ($). Bitte beziehen Sie sich unten Links für weitere Detail -

https://docs.microsoft.com/en-us/sql/t-sql/functions/isnumeric-transact-sql

Verwandte Themen