首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按一定顺序使SQL SERVER计算子句

按一定顺序使SQL SERVER计算子句
EN

Stack Overflow用户
提问于 2019-02-19 10:03:49
回答 5查看 104关注 0票数 3

以下表为例:

代码语言:javascript
运行
复制
CREATE TABLE TBL_Names(Name VARCHAR(32))

INSERT INTO TBL_Names
VALUES ('Ken'),('1965'),('Karen'),('2541')

木琴

执行以下查询会引发异常:

代码语言:javascript
运行
复制
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行转换失败。

在执行以下查询时,不会出现错误:

代码语言:javascript
运行
复制
SELECT  [name]
FROM    dbo.tblNames AS tn
WHERE   ISNUMERIC([name]) = 1
        AND [name] = 2541

我知道这是因为SQL Server查询优化器的决定。但是,我想知道是否有任何方法可以使sql server按特定顺序计算子句。这样,在第一个查询中,第一个子句过滤掉那些不是数字的Names,以便第二个子句在转换为数字时不会失败。

更新:正如您可能注意到的那样,上面的查询只是说明问题的一个实例。我知道这种隐式转换的风险,并感谢那些试图警告我这一点的人。然而,我的主要问题是如何改变优化器在某一顺序下评估子句的行为。

EN

Stack Overflow用户

发布于 2019-02-19 10:11:30

你可以试试这个

代码语言:javascript
运行
复制
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条件下有名称。

您可以找到现场演示这里

票数 0
EN
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54763518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档