在MS SQL 2016上排序NewID()奇怪的结果

时间:2018-06-22 07:57:21

标签: sql-server sql-server-2012

所有我刚刚发现的东西对我来说似乎很奇怪,或者可能我不了解这些NewID()值的性质,我清楚地看到顺序是错误的,对于Asc和Desc,您能否帮助我进行测试在其他env /

SELECT DATABASEPROPERTYEX('NXTest', 'Collation')  ----SQL_Latin1_General_CP1_CI_AS

; WITH cte AS ( SELECT * FROM (
SELECT '1' RecID,  NewID() ID UNION  SELECT '2' RecID,  NewID() ID UNION  SELECT '3' RecID,  NewID() ID UNION
SELECT '4' RecID,  NewID() ID UNION  SELECT '5' RecID,  NewID() ID UNION  SELECT '6' RecID,  NewID() ID )b )
SELECT * INTO #t FROM cte

SELECT *, LEN(iD) FROM #t   order BY ID     DESC

这些也是我的ID,也用于真实测试:

SELECT * FROM (
SELECT '1' RecID,  'B299ADAD-6A0C-4904-B04A-699714594175' ID UNION  SELECT '2' RecID,  '6CA58D90-CEDF-49E7-8C39-731A2B3F2387' ID UNION  
SELECT '3' RecID,  'F3CBCA7E-5F6E-42F5-B7E1-9DEF050239F6' ID UNION SELECT '4' RecID,  'FD22EAD9-094C-4F50-98D0-3A5D4EE0A500' ID UNION  
SELECT '5' RecID,  '9E3BFE14-701E-419E-B830-AD8717D9FA58' ID UNION  SELECT '6' RecID,  'AA35A5EC-0D09-43C8-B7CE-EB5948DD05A7' ID )b 

结果对我来说显然是错误的,9s和As的混合,请多多帮助。 This are my results:

1 个答案:

答案 0 :(得分:2)

在表中插入 NEWID() 值时,数据类型为 uniqueidentifier 。因此,您必须将其投射到 varchar 。这就是排序不正确的原因。

;with cte as ( 
    select * from (
        select '1' as [RecID],  cast(NewID() as varchar(36)) [ID] union
        select '2' as [RecID],  cast(NewID() as varchar(36)) [ID] union
        select '3' as [RecID],  cast(NewID() as varchar(36)) [ID] union
        select '4' as [RecID],  cast(NewID() as varchar(36)) [ID] union
        select '5' as [RecID],  cast(NewID() as varchar(36)) [ID] union
        select '6' as [RecID],  cast(NewID() as varchar(36)) [ID] 
    ) b 
)
select * into #t 
from cte;

select *, len([ID]) from #t 
order by [ID] desc;