3

我有一个选择命令,它返回答案记录,但它也在 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)

哪里有问题?

4

2 回答 2

2

难道不应该

AND (MCode = '0123456789')

?

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

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

WHERE   (Date BETWEEN '1390%' AND '1391%') AND
        ((BCode = 025) OR (MCode = '0123456789'))
于 2011-11-17T14:42:08.220 回答
1

我想我明白问题出在哪里:您正在将MCode(这是 a nvarchar)与查询中的整数值(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):它将避免将来令人头疼,使查询设计更容易,并使查询执行更快!

于 2011-11-17T14:40:37.900 回答