![](/img/trans.png)
[英]Arithmetic overflow error while converting varchar to decimal datatype
[英]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.