SQL 服务器在 SQL 中为奇数/偶数检查抛出错误

SQL Server throwing error in SQL for Odd / Even check

我有一个 SQL 服务器数据库,当我添加对偶数或奇数值的检查时,它在我的 table 之一上抛出错误。

这是一个会导致错误的示例脚本:

SELECT TOP 5 * 
FROM [TABLE_QUALIFIER].[TABLE_OWNER].[TABLE_NAME] WITH (nolock) 
WHERE street_number BETWEEN '1' AND '5000' 
  AND (street_number % 2) > 0 
  AND street_name LIKE '%Main St%' 
ORDER BY CAST(street_number AS float);

如您所见,我有这段语句检查奇数结果:

AND (street_number % 2) > 0

如果我去掉这部分调用,我得到一个成功的查询结果。但是,在这种情况下,我需要包括对奇数街道号码结果的检查。

当我使用此命令检查 table 信息时:

exec sp_columns [TABLE_NAME];

我可以看到 street_number 列被保存为 varchar 类型。在 SQL 语句中,您可以看到我将 street_number 值转换为浮点数。

关于如何修改此 SQL 查询以消除检查奇数 street_number 时的错误的任何建议?

附加信息:

Microsoft SQL Server 2017 (RTM-CU19) (KB4535007) - 14.0.3281.6 (X64) 2020 年 1 月 23 日 21:00:04 版权所有 (C) 2017 Microsoft Corporation 标准版(64 位)在 Windows Server 2016 Datacenter 10.0(内部版本 14393:)(管理程序)

这是一个概念性的例子。它包括 DDL 和示例数据填充。

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, street_number VARCHAR(10), street_name VARCHAR(50));
INSERT INTO @tbl (street_number, street_name) VALUES
('1', 'Main St.'),
('10', 'Not so Main St.'),
('20', 'Wall St.'),
('10A', 'Wall St.');
-- DDL and sample data population, end

;WITH rs AS
(
    SELECT ID, street_name
        , TRY_CAST(street_number AS INT) AS street_no
    FROM @tbl
)
SELECT TOP(5) * 
FROM rs
WHERE street_no BETWEEN 1 AND 5000
  AND (street_no % 2) > 0 
  AND street_name LIKE '%Main St%' 
ORDER BY street_no;

输出

+----+-------------+-----------+
| ID | street_name | street_no |
+----+-------------+-----------+
|  1 | Main St.    |         1 |
+----+-------------+-----------+