【发布时间】:2018-11-09 17:44:59
【问题描述】:
我有一个案例,我想检查是否在 varchar 表的列中找到整数值,但它是可以是整数的值的混合,有些只是字符串。我的第一个想法是使用子查询来选择具有数字式值的行。设置如下:
CREATE TABLE #tmp (
EmployeeID varchar(50) NOT NULL
)
INSERT INTO #tmp VALUES ('aa1234')
INSERT INTO #tmp VALUES ('1234')
INSERT INTO #tmp VALUES ('5678')
DECLARE @eid int
SET @eid = 5678
SELECT *
FROM (
SELECT EmployeeID
FROM #tmp
WHERE IsNumeric(EmployeeID) = 1) AS UED
WHERE UED.EmployeeID = @eid
DROP TABLE #tmp
但是,这会失败,并显示:“将 varchar 值 'aa1234' 转换为数据类型 int 时转换失败。”。
当我在子查询中只选择了行“1234”和“5678”时,我不明白为什么它仍在尝试将@eid 与“aa1234”进行比较。
(我意识到我可以将 @eid 转换为 varchar,但我很好奇 SQL Server 在这种情况下的行为)
【问题讨论】:
-
因为 SQL 将查询优化为 1 个单个查询。它不会先执行子查询。
-
虽然这可能与 SQL Server 2008: Error converting data type nvarchar to float 重复,但我不会投票结束,因为我更喜欢这里给出的答案。
-
这将工作
SELECT EmployeeID FROM #tmp WHERE ISNUMERIC(EmployeeID) = 1 AND EmployeeID = @eid -
@iSR5 不会。请阅读下面的答案,并可选择链接问题中的答案。
-
@iSR5 这可能有效,但也可能无效。
标签: sql sql-server