转换nvarchar值时转换失败' S'到数据类型int

时间:2016-12-17 19:36:29

标签: sql sql-server

我在玩SQL。 AdventureWorks2012数据库,表:Production.Products。

我试图获得color黑色的产品:或者weight为空,或者sizelistPrice高于某个值。

这是查询

SELECT * 
FROM AdventureWorks2012.Production.Product 
WHERE (Color = 'Black') 
  AND ((ListPrice > 300 AND Size > 60) OR Weight IS NULL)

但这是我得到的错误

  

转换nvarchar值时转换失败' S'数据类型int。

任何人都可以澄清我做错了吗?

6 个答案:

答案 0 :(得分:2)

Sizenvarchar(5),因此您的S来自哪里。

查看 schema for Adventureworks

答案 1 :(得分:1)

错误说明一切,您的列(ListPrice或Size)包含一个值为'S',并且您尝试对列执行数字比较操作(>),这会导致错误。

答案 2 :(得分:1)

尺寸='S'表示'小'?您知道“Size”列使用的数据类型是什么?如果它是单个字符,如S表示小而L表示大,则无法将其与整数进行比较。

答案 3 :(得分:1)

Size > 60

这是一个数字比较。查询引擎将尝试将Size的每个值转换为与60相同的类型,这是一个整数。尝试:

Size > '60'

但是,当然,这是一个字母数字比较,因此它将是字符串'60'之后按字母顺序排列的字符串。您可能需要使用TRY_CAST()TRY_CONVERT()

答案 4 :(得分:0)

也许使用Try_Convert()。这将为无效转换返回NULL

SELECT * FROM Production.Product 
 WHERE (Color = 'Black') 
   AND ((ListPrice > 300 AND try_convert(int,Size) > 60) OR Weight IS NULL)

答案 5 :(得分:0)

我认为“大小”列的数据类似S,L,M,XL,因此数据转换失败。由于您正在寻找值> 60,因此int是更高的总统数据类型,sql server会尝试将S,L,M,XL值转换为Int,从而导致错误。

更容易修复:而不是使用60使用包含值'60'的字符串作为列大小。

像...一样的东西。

SELECT * 
FROM AdventureWorks2012.Production.Product 
WHERE (Color = 'Black') 
AND ( (ListPrice > 300 AND Size > '60') 
      OR [Weight] IS NULL)