我有一个查询,我正在尝试检查scode
列中的代码范围。问题是scode
列包含一些nvarchar字符,并且在找到它们时出错。
如何运行以下查询,而不会返回错误。
SELECT dtExpires, dtFirst
FROM Customers
WHERE (scode BETWEEN 10 AND 100) OR
(scode BETWEEN 500 AND 600)
我收到错误:
将nvarchar值转换为数据类型int时转换失败
最佳答案
如果您无法修复确实应该做的数据类型...
短路的唯一可靠方法是将过滤后的结果填充到#temp表中。否则,您无法控制评估顺序。即使您使用子查询或CTE筛选ISNUMERIC() = 1
“ first”的行,SQL Server也会首先评估BETWEEN
有条件的条件,但仍然失败,并出现相同的错误。这可能并不总是发生,但是这是保证您避免这种情况的唯一方法:
SELECT dtExpires, dtFirst, scode
INTO #t
FROM dbo.Customers
WHERE scode NOT LIKE '%[^0-9]%'; -- this assumes no decimals allowed
SELECT dtExpires, dtFirst
FROM #t
WHERE (scode BETWEEN 10 AND 100)
OR (scode BETWEEN 500 AND 600);
DROP TABLE #t;