Sql nvarchar值的转换;0854697543“;select命令中的int列溢出

Sql nvarchar值的转换;0854697543“;select命令中的int列溢出,sql,selectcommand,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”的转

我有一个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)

问题出在哪里?

我想我理解问题出在哪里:您正在将查询中的
MCode
(这是一个
nvarchar
)与整数值(
0123456789
)进行比较,所以引擎正在尝试将每个记录的字段转换为int!! 试试这个

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

应该是吗

AND (MCode = '0123456789')
?

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

此外,您正在重复逻辑(
日期介于…
之间),更简洁:

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

您能告诉我们哪个字段存在
0854697543
值吗?为什么要使用
nvarchar
来表示日期?为什么要将日期值存储为
nvarchar(50)
?介于“1390%”和“1391%”之间的
意味着什么?因为“%”通配符运算符不适用于
BETWEEN
子句。@hamze:请参阅我编辑的答案,以更正查询中的许多错误!
WHERE   (Date BETWEEN '1390%' AND '1391%') AND
        ((BCode = 025) OR (MCode = '0123456789'))