2012-01-09 409 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';