我有一个查询,我正在尝试检查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;

08-06 07:08