首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

请大家帮忙解答这个关于order by 丢失数据的有关问题

2012-01-16 
请大家帮忙解答这个关于order by 丢失数据的问题以下用的是pubs..employee表:declare@strvarchar(1000)set

请大家帮忙解答这个关于order by 丢失数据的问题
以下用的是pubs..employee   表:

declare   @str   varchar(1000)
set   @str   =   ' '
select   @str   =   @str   +   fname   +   '   -   '   from   employee   where   job_id   =   5
order   by     hire_date
print   @str
===========================
结果为:Rita   -  


declare   @str   varchar(1000)
set   @str   =   ' '
select   @str   =   @str   +   fname   +   '   -   '   from   employee   where   job_id   =   5
--order   by     hire_date
print   @str
===========================
结果为:Paul   -   Carlos   -   Janine   -   Laurence   -   Rita   -   Sven   -   Maria   -  


select   *   from   employee   where   job_id   =   5
===========================
这条SQL明明有7条记录,为什么当我用变量累加的时候,当我用order   by的时候会丢失数据,不明白其中的道理,希望有高手解答,也提醒大家有类似的情况要多加注意,因为这个问题让我调了一下午都不知道问题出现在哪

[解决办法]
在我的电脑上显示的结果都一样啊!
[解决办法]
怎麼我得到的結果不一樣?

Use Pubs
GO
declare @str varchar(1000)
set @str = ' '
select @str = @str + fname + ' - ' from employee where job_id = 5
order by hire_date
print @str


set @str = ' '
select @str = @str + fname + ' - ' from employee where job_id = 5
--order by hire_date
print @str
GO
--Result
/*
Maria - Carlos - Laurence - Sven - Janine - Paul - Rita -
Paul - Carlos - Janine - Laurence - Rita - Sven - Maria -
*/
[解决办法]
我这里也是一样的。。。
[解决办法]
没碰过这样的情况,按照理论不会出这样的情况,只有次序先后不一样的情况。
[解决办法]
他的意思是加了order by 数据就变成只有一个了。。。

---
===========================
结果为:Rita -
[解决办法]
还真的第1次发现这样的情况,呵呵
看看
[解决办法]
我就是將兩種情況放在一起測試,所以就一個是注釋掉的,一個沒有注釋掉撒。
[解决办法]
不过我的执行后,结果一样
[解决办法]
结果一样,

是不是没有打patch.
[解决办法]
邹老大,还是厉害!早就知道这问题。

[解决办法]
你说的是那个patch
Microsoft SQL Server 2000 - 8.00.760 (Intel X86) Dec 17 2002 14:22:05 Copyright (c) 1988-2003 Microsoft Corporation Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 2)

[解决办法]
sp4
[解决办法]
晕,打了sp4就不对了?那我不打了
[解决办法]
:)
[解决办法]


是于原因,真的找不到什么理论可以解释,只有MS了,呵呵。在临时表中使用ORDER BY又是另一种情况。
这样的问题,可以这样解决,只供参考:

declare @str varchar(1000)
set @str = ' '
select @str = @str + fname + ' - ' from
(Select top 100 percent fname From
employee where job_id = 5
order by hire_date
) AS S
print @str
/*
Maria - Carlos - Laurence - Sven - Janine - Paul - Rita -
*/
[解决办法]
有沒有誰和樓主出現一樣的結果了?

好象我第一次執行我寫的那段代碼,和樓主的結果是一樣,但是後來就不一樣了,而且也執行不出那樣的結果了。
[解决办法]
我的也是2000的,繁體版的。
[解决办法]
能不能教一下怎么改?
[解决办法]
我的机器上也出这个问题,是sql server2000的bug吗?
[解决办法]
以下为转载:特说明
问题重现代码
-- 测试数据
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 ' <u> ' + value + N ' </u> ')
FROM @T
WHERE CHARINDEX(value, @str) > 0
--ORDER BY CHARINDEX(value, @str) DESC
SELECT @str
/* -- 结果(当赋值处理语句注释掉ORDER BY 时)
我不是一个 <u> 好人 </u> ,也不是 <u> 垃圾 </u>
-- */
/* -- 结果(当赋值处理语句加上ORDER BY 时)
我不是一个 <u> 好人 </u> ,也不是垃圾
-- */
从上面的列表可以看出,两种处理的最大差异,在于赋值前,是否有ORDER BY 子句,从一般的理解上,可能会认为是否排序并不重要,但换个角度来看问题,就比较容易理解为什么有ORDER BY子句后得不到我们想要的结果了:
当有ORDER BY子句时,对于SELECT @str = 这种赋值处理,SQL Server认为赋值处理肯定只会保留最后一条记录的处理结果,而ORDER BY子句确定了数据顺序,也就知道最后一条记录是那个,因此只会处理ORDER BY的最后一条记录。(读者可以自行去测试一下,调整ORDER BY顺序,看看结果是否与我的推论相符)
当没有ORDER BY子句时,因为无法确定数据顺序,所以SQL Server必须扫描满足条件的每条数据来得到结果,这样每扫描一条记录都会处理一次,所以结果是我们所预知的
问题解决方法:
修改处理语句,使查询优化器使用与我们需要结果一致的执行方法,可以解决这个问题。
对于示例中的处理语句,可以调整如下:
DECLARE @str nvarchar(4000)
SET @str = N '我不是一个好人,也不是垃圾 '
SELECT @str = REPLACE(@str, value, N ' <u> ' + value + N ' </u> ')
FROM(
SELECT TOP 100 PERCENT
value
FROM @T
WHERE CHARINDEX(value, @str) > 0
ORDER BY CHARINDEX(value, @str) DESC
)A
SELECT @str


热点排行
Bad Request.