nvarchar值“0854697543”的转换溢出了select命令中的int列

时间:2011-11-17 14:28:19

标签: sql selectcommand

我有一个select命令,它返回答案记录,但它也在Visual Studio 2010的查询构建器中使用此查询给出错误:

SELECT  *
FROM    Orders
WHERE   (BCode = 025) AND (Date BETWEEN '1390%' AND '1391%') OR
        (Date BETWEEN '1390%' AND '1391%') AND (MCode = 0123456789)

错误是:

  

错误消息:nvarchar值转换为“0854697543”
  溢出了一个int列

数据类型

BCode : nvarchar(50)
Date :  nvarchar(50)
MCode : nvarchar(10)

问题出在哪里?

2 个答案:

答案 0 :(得分:2)

不应该是

AND (MCode = '0123456789')

否则它将尝试使用0123456789作为整数,这将导致转换错误。

此外,你在逻辑(Date BETWEEN...)中重复自己,更简洁:

WHERE   (Date BETWEEN '1390%' AND '1391%') AND
        ((BCode = 025) OR (MCode = '0123456789'))

答案 1 :(得分:1)

我想我明白问题出在哪里:您在查询中将MCodenvarchar}与整数值(0123456789)进行比较,因此引擎正在尝试为每个记录转换你的字段为int !! 试试这个

SELECT  *
FROM    Orders
WHERE   (BCode = '025') AND 
        (LEFT(Date, 4) = '1390' OR LEFT(Date, 4) = '1391') AND 
        (MCode = '0123456789')

正如我在评论中已经告诉过你的那样:不要使用nvarchar(50)存储日期!为每一列使用适当的数据类型(例如DateTime或Date):它将避免日后的麻烦,使查询设计更容易,并使查询执行真的更快!