`
happmaoo
  • 浏览: 4465868 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

SELECT 赋值与ORDER BY冲突的问题

阅读更多
<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog336280.html" frameborder="0" width="336" scrolling="no" height="280"></iframe>

问题描述:

使用 SELECT 语句,轮询表中的数据,并且处理变量数据时,如果有ORDER BY语句,则得不到想要的结果,但去掉ORDER BY,结果正常。

具体的问题表现参考下面的问题重现代码

问题重现代码

-- 测试数据

DECLARE @T TABLE(id int,value nvarchar(16))

INSERT INTO @T SELECT

1, N'好人' UNION ALL SELECT

2, N'坏人' UNION ALL SELECT

3, N'吃饭' UNION ALL SELECT

4, N'垃圾'

-- 赋值处理

DECLARE @str nvarchar(4000)

SET @str = N'我不是一个好人,也不是垃圾'

SELECT @str = REPLACE(@str, value, N'' + value + N'')

FROM @T

WHERE CHARINDEX(value, @str) > 0

--ORDER BY CHARINDEX(value, @str) DESC

SELECT @str

/* -- 结果(当赋值处理语句注释掉ORDER BY )

我不是一个好人,也不是垃圾

-- */

/* -- 结果(当赋值处理语句加上ORDER BY )

我不是一个好人,也不是垃圾

-- */

问题分析:

两个处理语句的结果不同,通过查看它们的执行计划应该可以看出原因所在,为此,通过

SET SHOWPLAN_ALL ON

输出了两种执行语句的执行计划(仅StmtText部分,有兴趣的读者在自己的电脑上测试的时候,可以去了解其他部分的信息)

StmtText

Step

DECLARE @str nvarchar(4000) SET @str = N'我不是一个好人,也不是垃圾'

 

SELECT @str = REPLACE(@str, value, N'' + value + N'') FROM @T WHERE CHARINDEX(value, @str) > 0

4

|--

Compute Scalar(DEFINE:([Expr1002]=replace([@str], @T.[value], ''+@T.[value]+'')))

3

|--

Filter(WHERE:(charindex(@T.[value], [@str], NULL)>0))

2

|--

Table Scan(OBJECT:(@T))

1

DECLARE @str nvarchar(4000) SET @str = N'我不是一个好人,也不是垃圾'

 

SELECT @str = REPLACE(@str, value, N'' + value + N'') FROM @T WHERE CHARINDEX(value, @str) > 0 ORDER BY CHARINDEX(value, @str) DESC

5

|--

Sort(ORDER BY:([Expr1003] DESC))

4

|--

Compute Scalar(DEFINE:([Expr1002]=replace([@str], @T.[value], ''+@T.[value]+''), [Expr1003]=charindex(@T.[value], [@str], NULL)))

3

|--

Filter(WHERE:(charindex(@T.[value], [@str], NULL)>0))

2

border-right: medium none; padding-right: 0cm; border-top: medium none; padding-left: 0cm; padding-bottom: 0cm; margin: 0cm 0cm 0pt; border-left: medium none; padding-top: 0cm

分享到:
评论

相关推荐

    LINQ_to_SQL语法及实例大全

    - 示例:`var sortedProducts = from p in Products where p.IsAvailable orderby p.Price descending select p;` - **降序排序** - 示例:`var sortedProducts = from p in Products orderby p.Price descending ...

    LINQ To SQL 语法及实例大全

    orderby p.Category, p.Price descending select p; ``` 首先按类别排序,然后按价格降序排序。 **6. 带 GroupBy 形式** ```csharp var query = from p in db.Products group p by p.Category into g orderby...

    oracle数据库经典题目

    ORDER BY C. WHERE D. GROUP BY 11. 查询一个表的总记录数,可以采用_________统计函数。( C ) A. AVG(*) B. SUM(*) C. COUNT(*) D.MAX(*) 12. 要建立一个语句向Types表中插入数据,这个表只有两列,T_ID和T_...

    BD2在主机中的错误代码详解

    创建视图或使用ORDER BY子句时,语法错误会导致此类问题。 15. **-11042606 - 数学运算溢出** 执行数学运算时,结果超出了可表示的范围,如整数溢出。 16. **-11142901 - 非法字符** 输入的字符串包含非法字符...

    数据库sqlserver攻关

    ### Set和Select赋值区别 SET用于为变量赋值,而SELECT用于从结果集中选择数据。在SQL Server中,通常使用SET给局部变量赋值,使用SELECT将数据查询结果赋值给变量。 ### 完整的对象名称由四个标识符组成 在SQL ...

    DB2异常SQLCODE信息

    - **-12542805**:ORDER BY子句中列名不存在,可能是在排序操作中指定的列名与表结构不匹配。 通过以上对DB2异常SQLCODE信息的详述,可以更准确地理解每种错误代码背后的原因,从而有效地进行问题定位和解决。在...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    认真听课、多思考问题、多动手操作、有问题一定要问、多参与讨论、多帮组同学 五、 体系结构 oracle的体系很庞大,要学习它,首先要了解oracle的框架。oracle的框架主要由物理结构、逻辑结构、内存分配、后台进程...

    db2 异常说明

    - **-12242803**:GROUP BY子句中未包含所有SELECT列表中的列。 - **-12342601**:对象名称或引用不存在。 - **-12542805**:表达式中使用的函数或操作符不正确。 以上列举的是一些常见的DB2异常情况及其解释。了解...

    ORACLESQL拼接语句.docx

    还可以使用聚合函数(如COUNT、SUM、AVG等),分组(GROUP BY)、排序(ORDER BY)、连接(JOIN)和其他复杂查询结构。 4. **其他知识点** - **行级锁**:在执行DML语句时,Oracle会自动加上行级锁,防止并发冲突...

    sql书写优化和性能优化

    频繁使用`ORDER BY`和`GROUP BY`会导致性能下降,特别是在没有适当索引支持的情况下。如果必须使用排序或分组操作,尽量建立在已有的索引列上。 **11. 避免使用NOT或!=** 对于索引列的比较,尽量避免使用`NOT`或`!...

    SQL语句详解 MySQL update的正确用法

    但请注意,`ORDER BY`和`LIMIT`不能与多表UPDATE同时使用。 权限方面,对于被更新的列,你需要UPDATE权限,而对于仅被读取的列,你需要SELECT权限。在多表更新中,表的更新顺序可能因优化器而异,特别是涉及到...

    php面试题必考

    1. **SQL语言**:熟练编写SELECT, INSERT, UPDATE, DELETE语句,理解JOIN, GROUP BY, HAVING, ORDER BY等子句。 2. **数据库设计**:理解数据库范式,能进行数据库表结构设计。 3. **索引**:知道索引的作用,B树...

    哥知名IT公司笔试题

    - 成绩最高的学生号:`SELECT sno FROM sc GROUP BY sno ORDER BY grade DESC LIMIT 1` - 每科大于90分的人数:`SELECT COUNT(*) FROM sc WHERE grade &gt; 90` 这些题目的解答涵盖了C++基础语法、数据结构、算法、...

    易语言-ACCESS数据库完全操作增删改查易语言

    也可以使用"ORDER BY"进行排序,"GROUP BY"进行分组统计。 7. 数据库游标:在易语言中,为了遍历查询结果,通常会用到数据库游标。游标允许程序逐行访问结果集,向前或向后移动,甚至可以修改当前行数据。 8. 关闭...

    mysql update语句的用法详解

    需要注意的是,`ORDER BY`和`LIMIT`不能与多表`UPDATE`同时使用。在涉及InnoDB表的多表`UPDATE`中,如果有外键约束,优化器可能会按非预期的顺序处理表,导致语句无效并回滚。同时,`ON UPDATE`功能允许InnoDB表与...

Global site tag (gtag.js) - Google Analytics