簡體   English   中英

將數據類型 nvarchar 轉換為數字時出錯

[英]Error converting datatype nvarchar to numeric

我的表數據

金額1 金額2 預期結果
100 200 4.17%
一種 500
500
20 100 1.67%
CREATE TABLE [dbo].[tblData](
    [Amount1] [nvarchar](50) NULL,
    [Amount2] [nvarchar](50) NULL
) ON [PRIMARY]

INSERT [dbo].[tblData] ([Amount1], [Amount2]) VALUES (N'100', N'200')
INSERT [dbo].[tblData] ([Amount1], [Amount2]) VALUES (N'A', N'500')
INSERT [dbo].[tblData] ([Amount1], [Amount2]) VALUES (N'', N'')
INSERT [dbo].[tblData] ([Amount1], [Amount2]) VALUES (N'500', N'B')
INSERT [dbo].[tblData] ([Amount1], [Amount2]) VALUES (N'20', N'100')

當我在一行上運行時,這按預期工作正常

SELECT TOP 1
    Concat(CAST((cast(Amount1 AS decimal(18,4))/(cast(Amount2 AS decimal(18,4))*12))*100 AS decimal(18,2)),'%') AS Result
FROM tblData 

當我在整個桌子上運行時失敗

SELECT 
    Concat(CAST((cast(Amount1 AS decimal(18,4))/(cast(Amount2 AS decimal(18,4))*12))*100 AS decimal(18,2)),'%') AS Result
FROM tblData

返回以下錯誤消息。

將數據類型 nvarchar 轉換為數字時出錯

在執行任何操作之前檢查列是否為數字:

SELECT Amount1
       , Amount2
       , case when isnumeric(Amount1) = 1 and isnumeric(Amount2) = 1 then
Concat(CAST((cast(Amount1 AS decimal(18,4))/(cast(Amount2 AS decimal(18,4))*12))*100 AS decimal(18,2)),'%') 
         else 
null
         end AS "Expected Result"
FROM tblData 

這是一個演示

如果您的數據中有 0,則如下所示:

SELECT Amount1, Amount2, 
case when isnumeric(Amount1) = 1 and isnumeric(Amount2) = 1 and Amount2 > 0 and Amount1 > 0 then
Concat(CAST((cast(Amount1 AS decimal(18,4))/(cast(Amount2 AS decimal(18,4))*12))*100 AS decimal(18,2)),'%') 
when isnumeric(Amount1) = 1 and isnumeric(Amount2) = 1  and Amount1 = 0 and Amount1 > 0 then
Concat(CAST((cast(1 AS decimal(18,4))/(cast(Amount2 AS decimal(18,4))*12))*100 AS decimal(18,2)),'%') 
when isnumeric(Amount1) = 1 and isnumeric(Amount2) = 1  and Amount1 > 0 and Amount1 = 0 then
Concat(CAST((cast(Amount1 AS decimal(18,4))/(cast(1 AS decimal(18,4))*12))*100 AS decimal(18,2)),'%') 
else 
null
end AS "Expected Result"
FROM tblData 

這是第二個演示

如果你有一個主要是數字的文本字段,但你不能依賴 then 而不是

cast(Amount1 AS decimal(18,4))

你可以使用

try_cast(Amount1 AS decimal(18,4))

如果無法完成轉換,則返回 Null

我使用 try_convert 但這只是個人喜好,它們實際上是一樣的

try_convert(小數(18,4),金額 1)

所以你的陳述的開頭看起來像這樣

case 
when try_cast(Amount1 as decimal(18,4))  is not null --Numeric 
and try_cast(Amount2 as decimal(18,4)) > 0 --Numeric and not zero
then Concat(CAST((try_cast(Amount1 AS decimal(18,4))/(try_cast(Amount2 AS decimal(18,4))*12))*100 AS decimal(18,2)),'%') 

暫無
暫無

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

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