日期:2014-05-17  浏览次数:20591 次

难道是SQL2008的Bug么?大虾进来看看
我遇到了和这哥们发的帖子一样的问题:http://bbs.csdn.net/topics/390028807#new_post
问题纠结在于sys.dm_os_wait_stats里的wait_type是否有重复值!
大家不妨在你的DB里运行下面代码验证下~

-- 一般我们用DISTINCT来去重
select count(wait_type) from sys.dm_os_wait_stats;
select count(distinct wait_type) from sys.dm_os_wait_stats;
-- 以上结果都是490,也就是说wait_type是没有重复的
-- 但是,进行如下操作,系统会告诉你有重复值!!!
-- 获取一个表dbo.WaitStats存储wait_type;清空数据
SELECT wait_type INTO dbo.WaitStats FROM sys.dm_os_wait_stats; 
TRUNCATE TABLE dbo.WaitStats;
-- 对dbo.WaitStats的wait_type添加主键约束,再插入
ALTER TABLE dbo.WaitStats ADD CONSTRAINT PK_WaitStats PRIMARY KEY(wait_type);
SELECT wait_type INTO dbo.WaitStats FROM sys.dm_os_wait_stats; 
-- 失败,“违反了 PRIMARY KEY 约束 'PK_WaitStats'。不能在对象 'dbo.WaitStats' 中插入重复键。”

之前已经验证没有重复了,但是插入的时候系统却提示有重复值!即使这样操作也不行:

TRUNCATE TABLE dbo.WaitStats;
SELECT DISTINCT wait_type INTO dbo.WaitStats FROM sys.dm_os_wait_stats; 
-- 好神奇,DISTINCT居然不能对nvarchar(60)类型去重!!

于是我把那490行的数据Copy出来贴到Excel,利用Excel去重功能,发现结果少了10多行!!!
但是这样是可以的:

TRUNCATE TABLE dbo.WaitStats;
SELECT top 10 wait_type INTO dbo.WaitStats FROM sys.dm_os_wait_stats; 
-- 很简单,前10行没有重复,所以不违背主键约束;但是为什么上面加了DISTINCT也不行呢???


实在无法接受这样的事实,于是我跑到了SQL2005上执行,居然发现2005上没有问题!
这是什么情况啊。。。亲,你怎么看?
sqlserver2008

------解决方案--------------------
终于可以再次回复了,你看这个,我不敢说是不是bug,如果不是bug,那就是微软有某些意图额外存放,不过既然2005和2012都没问题,那也有可能是当初的一个bug,后来修复了。
------解决方案--------------------

SELECT  COUNT(wait_type)
FROM    sys.dm_os_wait_stats ;
SELECT  COUNT(DISTINCT wait_type)
FROM    sys.dm_os_wait_stats ;

SELECT  wait_type
INTO    #t
FROM    sys.dm_os_wait_stats
GROUP BY wait_type

ALTER TABLE [#t] ALTER COLUMN [wait_type] NVARCHAR(50) COLLATE Chinese_PRC_90_CI_AI
 
SELECT  COUNT(wait_type)
FROM    #t ;
SELECT  COUNT(DISTINCT wait_type)
FROM    #t ;

 


 
SELECT DISTINCT wait_type  
FROM    sys.dm_os_wait_stats
WHERE   [wait_type] = 'MISCELLANEOUS'


 
SELECT DISTINCT wait_type COLLATE Chinese_PRC_90_CI_AI
FROM    sys.dm_os_wait_stats
WHERE   [wait_type] = 'MISCELLANEOUS' COLLATE Chinese_PRC_90_CI_AI
ORDER BY wait_type COLLATE Chinese_PRC_90_CI_AI

------解决方案--------------------
SELECT  wait_type