问题描述:使用SELECT语句,轮询表中的数据,并且处理变量数据时,如果有ORDERBY语句,则得不到想要的结果,但去掉ORDERBY,结果正常。具体" />

SELECT 赋值与ORDER BY冲突的问题

系统 2185 0
<iframe align="top" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog01.html" frameborder="0" width="728" scrolling="no" height="90"></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; border-

分享到:
评论
happmaoo
  • 浏览: 1292148 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最新评论

SELECT 赋值与ORDER BY冲突的问题


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论