解决方案 »

  1.   


    我上次在2014上面执行,CTP1还有759种,2005我没环境
      

  2.   

    你那个代码还要改一下,不能两次select into,在我的环境下,2012没问题,2008R2的确会报错,我再研究一下
    -- 一般我们用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);
    INSERT INTO dbo.WaitStats
    SELECT wait_type  FROM sys.dm_os_wait_stats; 
    -- 失败,“违反了 PRIMARY KEY 约束 'PK_WaitStats'。不能在对象 'dbo.WaitStats' 中插入重复键。”
      

  3.   


    查到了,20082R2中这个值重复了,你把代码改成这样一样重复:
    -- 一般我们用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; 
    ALTER TABLE dbo.WaitStats ADD CONSTRAINT PK_WaitStats PRIMARY KEY(wait_type);我就是这样查到这个重复值的
      

  4.   

    换这种试试吧:
    insert into waitstats select distinct ... from ...
      

  5.   

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

  6.   


    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_typeALTER 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
      

  7.   


    感谢版主!
    上面有个代码我确实是Copy到论坛上的时候Copy错了;应该是
    INSERT dbo.WaitStats SELECT wait_type FROM sys.dm_os_wait_stats;
    另外,我之前也是发现了和你一样的那个重复值MISCELLANEOUS
    可是,确实是奇怪啊为什么2008R2下会报错
    INSERT dbo.WaitStats SELECT DISTINCT wait_type FROM sys.dm_os_wait_stats;
    这样也不行!!!
      

  8.   

    有重复值肯定不行,我觉得既然前后两个版本没问题,2008就有问题,那.....尚且认为是bug吧。没必要纠结太多
      

  9.   

    按照这位哥们在#7给出的代码,确实是发现了症结~~~如果限制排序规则Chinese_PRC_90_CI_AI的话是没有重复的哦;我一直以为“重复的元组”是指每个字符和长度对应完全一样的字符串
    SQLServer对“重复的元组”是如何定义?DISTINCT的时候不考虑排序规则?
      

  10.   

    版主在#3说那样查到重复值,事实上我按照下面的查 是没有数据的(2008R2上)
    select wait_type,count(wait_type) as cnt from sys.dm_os_wait_stats
    group by wait_type having count(wait_type)>1
      

  11.   

    那也应该会得出这样的结果
    MISCELLANEOUS 2
    可是啥都没有
      

  12.   

    CI_AI使得大小写不敏感,我的测试环境是:SQL_Latin1_General_CP1_CI_AS,也就是对重音敏感
      

  13.   

    我的是Chinese_PRC_CI_AS
    所以,版主,这归结为排序规则问题啦?
      

  14.   

    select wait_type COLLATE Chinese_PRC_90_CI_AI,count(wait_type) as cnt from sys.dm_os_wait_stats
    group by wait_type COLLATE Chinese_PRC_90_CI_AI
    having count(wait_type)>1这样就能出来
    MISCELLANEOUS 2
      

  15.   

    似乎真是一个bug
    这种情况我测试了,没有重现过而且我看了下打过sp2的库里面
    只有一行记录SELECT   wait_type  
    FROM    sys.dm_os_wait_stats 
    WHERE   [wait_type] = 'MISCELLANEOUS'
      

  16.   

    @版主,插问您个另外的问题哦,下面的代码是SQL2008的语法,如果在2005上要显示设置怎么弄?
    ALTER TABLE dbo.ConsumeInfo SET (LOCK_ESCALATION = TABLE)
    锁升级问题,上个月将数据临时转到2005上时候遇到这问题,虽然说SQLServer默认锁升级是TABLE,但是如何如何显示设置啊,如果要设置为其他的还真不知道,2005上
    Thanks!
      

  17.   

    SELECT  wait_type 
    INTO #tb 
    FROM    sys.dm_os_wait_stats
    WHERE   [wait_type] = 'MISCELLANEOUS'
    --2
    SELECT name ,[collation] FROM [tempdb].sys.[syscolumns] AS s WHERE id=OBJECT_ID('tempdb..#tb')
    SELECT DISTINCT wait_type FROM #tb
    ORDER BY wait_type COLLATE Chinese_PRC_CI_AS
    --1
      

  18.   


    sql server 2005好像没有办法设置这个参数。
      

  19.   

    今天试了试SQL Server 2005 Chinese_PRC_CI_AS 排序规则环境下的状况,不会存在重复值select count(wait_type) from sys.dm_os_wait_stats
    select count(distinct wait_type) from sys.dm_os_wait_stats
    -- 都一样 = 202
    select wait_type COLLATE Chinese_PRC_90_CI_AI,count(wait_type) as cnt from sys.dm_os_wait_stats
    group by wait_type COLLATE Chinese_PRC_90_CI_AI
    having count(wait_type)>1
    select wait_type ,count(wait_type) as cnt from sys.dm_os_wait_stats
    group by wait_type
    having count(wait_type)>1
    -- 一样,没有重复的
    select count(wait_type) from sys.dm_os_wait_stats where wait_type = 'MISCELLANEOUS'
    -- 这个值也没有重复sys.dm_os_wait_stats是一个系统视图,不同版本中其所调用的系统基表是不一样的再回到SQL Server 2008 R2  Chinese_PRC_CI_AS 的环境下,居然‘MISCELLANEOUS’在重音敏感的情况下没区别,当重音不敏感时(_AI)有区别
    所谓的重音
      

  20.   


    AI 指定不区分重音,AS 指定区分重音。如果想让比较将重音和非重音字母视为不等,请选择该选项。如果选择该选项,  比较还将重音不同的字母视为不等。区分重音字符和非重音字符。例如,“a”和“?”将被视为不同的字符。如果未选择此项,在排序时,SQL Server 将把字母的重音形式和非重音形式视为相同。
    我查了一下,sql server 2008在这方面也有其他的bug,所以说不好,你发现的问题真是一个bug:修复: 前缀搜索使用的扩展的字符或重音在 SQL Server 2008年中返回错误的结果
    http://support.microsoft.com/kb/973090/zh-cn