【发布时间】:2020-01-03 22:45:18
【问题描述】:
我尝试运行一个非常简单的代码,但由于我不明白的原因,它无法正常工作。这是我的代码:
WITH CTE AS
(
SELECT DISTINCT OrderNo
FROM OrderDet
WHERE PartNo LIKE '%.%'
AND OrderNo NOT LIKE '%[a-z]%'
)
SELECT *
FROM CTE
WHERE CAST(CTE.OrderNo AS INT) >= 21187
运行此代码会引发以下错误:
将 varchar 值“20361E”转换为数据类型 int 时转换失败。
现在我知道有 OrderNo 值包含“E”,但是,就我而言,我在 CTE 中将它们过滤掉。如果我在 CTE 中单独运行语句,我会得到 580 条记录,其中没有一条有任何字母。
这是怎么回事?
【问题讨论】:
-
欢迎来到 SQL 优化的辉煌世界。无法保证条件的实际评估顺序与您认为的逻辑评估顺序相匹配。
-
更好的问题是为什么您将字母数字值存储为 OrderNo,然后尝试将其视为数字值。
-
This 回答可能会提供一些线索。
-
您使用的是哪个版本的 SQL Server?如果它没有不受支持(或非常接近),它应该有
TRY_CONVERT在它无法转换时产生空值而不是错误。 -
SQL 2012 是的,我实际上知道 TRY_CAST,它绝对有效。但是,我觉得使用它就像一个创可贴,而我的原始查询应该 100% 有效,我只是在寻找原因的解释。看起来很奇怪,它没有按我的意愿工作
标签: sql-server tsql sql-server-2012