2012-01-09 126 views
3

在已設置爲nvarchar但僅包含數字的字段的SQL查詢中,是否可以使用SUM函數?在nvarchar字段上使用SUM

+3

更改列類型是正確的類型,你不會有這樣的問題。 – Oded 2012-01-09 12:10:12

+0

有時(例如,如果您正在使用第三方架構),這種更改並非總是可行。 – 2012-01-09 12:15:10

+0

@Oded - 我希望我可以downvote您的評論。你正在假設關於OP的很多事情。他可能無法控制數據庫。可能有其他推理,爲什麼列是nvarchar(就像讀取數據庫的某些API只能讀取文本列或類似的東西)。看不起提問者的無益評論不是SO精神。 – data 2014-06-17 09:27:26

回答

12

這可以通過鑄造:

SELECT SUM(CAST(NVarcharCol as int)) 

然而,這將拋出一個例外是1個或更多的記錄不能CASTint

如果您的列只有數值,我建議將數據類型更改爲int以保存未來的問題。

如果您不能更改數據類型,那麼下面WHERE條款將阻止拋出的異常:

WHERE ISNUMERIC([NVarcharCol])=1 
+0

該解決方案可以擴展爲排除那些where子句中不是數字的值,從而首先防止類型轉換錯誤。或者在代碼中您可以檢查是否有任何非數字值先存在並在嘗試查詢之前處理它們。由於字段不是int,因此每次都會花費這些開銷。 – xQbert 2012-01-09 12:23:22

+0

@xQbert - 歡呼聲我在回答中包含了WHERE子句選項 – Curt 2012-01-09 12:27:54

+1

是一個很好的答案,我認爲OP對評論可能有一些價值。乾杯。 – xQbert 2012-01-09 13:32:39

3
select sum (cast (myFiled as int)) from myTable 
1

你必須將varchar轉換爲數字型使用SUM之前它會導致錯誤:

Msg 8117,Level 16,State 1,Line 6 對於sum運算符,操作數數據類型varchar無效。

如果它只包含數字數據 - 那麼在varchar中存儲數據的意義何在?

+1

這是一個歷史數據庫,我已經選擇並需要運行查詢,數據類型是在幾年前建立的。 – 2012-01-09 12:29:53

1

你需要鑄造,試試這個

SUM(COALESCE(CoumnName, 0)) 
0

使用SUM(COALESCE(CoumnName,0)) 我建議,你應該改變的數據類型number.Its好的做法。

0

如果你想添加兩個nvarchar列。 列TestTotal(nvarchar的),列TestFailed(nvarchar的),列TestPassed(NVARCHAR)

UPDATE [your_db].[dbo].[your_table] 
SET your_table.TestTotal = Convert(nvarchar, cast (your_table.TestFailed as int) + cast (your_table.TestPassed as int)) 
WHERE TestTotal='your_condition';