以下表为例:
CREATE TABLE TBL_Names(Name VARCHAR(32))
INSERT INTO TBL_Names
VALUES ('Ken'),('1965'),('Karen'),('2541')木琴
执行以下查询会引发异常:
SELECT [name]
FROM dbo.tblNames AS tn
WHERE [name] IN ( SELECT [name]
FROM dbo.tblNames
WHERE ISNUMERIC([name]) = 1 )
AND [name] = 2541当将varchar值'Ken‘转换为数据类型int时,Msg 245、级别16、状态1、第1行转换失败。
在执行以下查询时,不会出现错误:
SELECT [name]
FROM dbo.tblNames AS tn
WHERE ISNUMERIC([name]) = 1
AND [name] = 2541我知道这是因为SQL Server查询优化器的决定。但是,我想知道是否有任何方法可以使sql server按特定顺序计算子句。这样,在第一个查询中,第一个子句过滤掉那些不是数字的Names,以便第二个子句在转换为数字时不会失败。
更新:正如您可能注意到的那样,上面的查询只是说明问题的一个实例。我知道这种隐式转换的风险,并感谢那些试图警告我这一点的人。然而,我的主要问题是如何改变优化器在某一顺序下评估子句的行为。
发布于 2019-02-19 10:11:30
你可以试试这个
SELECT [name]
FROM dbo.TBL_Names AS tn
WHERE [name] IN ( SELECT [name]
FROM dbo.TBL_Names
WHERE ISNUMERIC([name]) = 1 )
AND [name] = '2541'你只需要从[name] = 2541到[name] = '2541'。您缺少了' (单引号),在where条件下有名称。
您可以找到现场演示这里。
https://stackoverflow.com/questions/54763518
复制相似问题