簡體   English   中英

將varchar轉換為Decimal時出錯

[英]Error while converting varchar to Decimal

在我的桌子上有一列(Varchar)。 它包含類似“ abc ^ 1234567 ^ xyz”的值。 我需要選擇值的一部分,並將其轉換為數字,然后將其轉換為十進制數字,然后通過將兩個表連接起來,將該數字與另一個表中的數字進行比較。 到目前為止,我想將其從varchar轉換為十進制時遇到錯誤。

這是我的錯誤消息:消息8114,級別16,狀態5,行1將數據類型varchar轉換為數值時出錯。 這是我的代碼:

SELECT  
    a.Status,
    Cast(SUBSTRING(sourceNatKey, LEN(sourceNatKey)-11,7) As Decimal(18,4)),
    b.caseId
FROM AGREEMENT_STATUS a
INNER JOIN APPLICATION_FACT b
ON 
Cast(SUBSTRING(sourceNatKey, LEN(sourceNatKey)-11,7) As decimal(18,4)) = 
b.caseId

在這種情況下,可以在JOIN中使用LIKE運算符。 但是,如果確實需要從這樣的字符串中獲取子字符串('abc ^ 1234567 ^ xyz'),則可以使用以下結構:

 SELECT  
        a.Status,
       Cast(SUBSTRING(sourceNatKey, CHARINDEX('^',sourceNatKey) + 1,CHARINDEX('^',sourceNatKey, CHARINDEX('^',sourceNatKey)+1) - CHARINDEX('^',sourceNatKey) - 1)  As decimal(18,4)),
        b.caseId
    FROM AGREEMENT_STATUS a
    INNER JOIN APPLICATION_FACT b
    ON 
    Cast(SUBSTRING(sourceNatKey, CHARINDEX('^',sourceNatKey) + 1,CHARINDEX('^',sourceNatKey, CHARINDEX('^',sourceNatKey)+1) - CHARINDEX('^',sourceNatKey) - 1)  As decimal(18,4)) = 
    b.caseID

您可以通過其他方式執行此操作:

SELECT  
    a.Status,
    b.caseId
FROM AGREEMENT_STATUS a JOIN
     APPLICATION_FACT af
     ON sourceNatKey LIKE '%^' + CAST(b.caseID as varchar(255)) + '^%'

caseId列在第二列中包含信息,因此無需重復。

給定值abc^1234567^xyz SUBSTRING(sourceNatKey, LEN(sourceNatKey)-11,7)代碼SUBSTRING(sourceNatKey, LEN(sourceNatKey)-11,7)將導致^123456 這失敗,因為^為非數字。 LEN調用中的偏移值更改為-10 ,以便僅檢索字符串的數字部分。

有關SUBSTRING更多信息,請參見SUBSTRING(Transact-SQL)文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM