我有一个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)
问题出在哪里?
答案 0 :(得分:2)
不应该是
AND (MCode = '0123456789')
否则它将尝试使用0123456789作为整数,这将导致转换错误。
此外,你在逻辑(Date BETWEEN...
)中重复自己,更简洁:
WHERE (Date BETWEEN '1390%' AND '1391%') AND
((BCode = 025) OR (MCode = '0123456789'))
答案 1 :(得分:1)
我想我明白问题出在哪里:您在查询中将MCode
(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):它将避免日后的麻烦,使查询设计更容易,并使查询执行真的更快!