2017-08-30 83 views
1

下面我查詢的一部分,最初失敗:什麼是ISNUMERIC函數在sql server中發現爲TRUE的所有值?

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 

下面是我們得到的錯誤:

com.microsoft.sqlserver.jdbc.SQLServerException:錯誤的數據類型爲nvarchar轉換爲數字。 rootCause複製=的SQLException#1:錯誤碼:8114 SQLSTATE:S0005信息:錯誤數據類型爲nvarchar轉換爲數字。

我意識到,它認爲'.' & '-'爲數字了。

因此,我增加"NOT npx.nvcAnswer in('.' , '-')"它和它的工作。

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 

經過一天,它開始失敗,再次出現以下錯誤。

com.microsoft.sqlserver.jdbc.SQLServerException:將數據類型nvarchar轉換爲數字時出錯。 rootCause複製=的SQLException#1:錯誤碼:8114 SQLSTATE:S0005信息:錯誤數據類型爲nvarchar轉換爲數字。

然後,我改變了下面的框和它的工作:(但我沒能找到什麼樣的價值觀是導致此問題)

OLD:

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

新:

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

問:

什麼是SQL Server的所有值ISNUMERIC函數發現爲真?

+1

太長上市。即有些僅在某些組合中有效,如'1d1'。相反,如您所做的那樣,請使用您認爲有效的字符白名單。 'ISNUMERIC'回答了人們從未想過要問的問題 - 「這個字符串可以轉換爲*任何*的數字數據類型(我不關心*它可以轉換成哪種類型)? 「 –

回答