将nvarchar值转换为数据类型int时转换失败

Shm*_*nix 2 sql sql-server sql-server-2005

我有一个查询,我正在尝试检查scode列中的一系列代码.问题是scode列包含一些nvarchar字符,并在找到它们时出错.

如何在不返回错误的情况下运行以下查询.

SELECT dtExpires, dtFirst
FROM Customers
WHERE (scode BETWEEN 10 AND 100) OR
      (scode BETWEEN 500 AND 600)
Run Code Online (Sandbox Code Playgroud)

我收到的错误:

将nvarchar值转换为数据类型int时转换失败

Aar*_*and 7

如果你不能修复数据类型,这真的是你应该做的......

唯一可靠的短路方法是将过滤后的结果填充到#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;
Run Code Online (Sandbox Code Playgroud)