SQL uniqueidentifier

Posted AdolphChen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL uniqueidentifier相关的知识,希望对你有一定的参考价值。

在项目中遇到一个SQL的问题:

select n.RootId as NodeId,r.PLACE_NAME as Node,Count(n.RootId) as Count,c.Year,c.Month,c.Day,c.Hour from 
connection.Connection c
inner join location.Node n on n.NETBAR_WACODE = c.NETBAR_WACODE
and n.RootId is not null
inner join location.Node r on r.NETBAR_WACODE = n.RootId
where c.CreatedDate >= @StartDate and c.CreatedDate <= @EndDate
group by n.RootId,r.PLACE_NAME,c.Year,c.Month,c.Day,c.Hour
order by c.Year desc,c.Month desc,c.Day desc,c.Hour desc

以上SQL执行的时候,会报以下的错误信息:

Insufficient result space to convert uniqueidentifier value to char.

 

 

然后去查了下Uniqueidentifier的概念

发现Uniqueidentifier存储大小为16个字节,16个字节=32个字符,
然而一般我们的GUID: 52337445-56FD-456E-9AF4-F83CFC5C4016 的长度为36,它怎么存的下呢?

答案是:

GUID在存储的时候是不存储那四个连接号的,所以是36-4=32.而GUID的字符都是十六进制的,一个16进制用四位表示,一个字节8位,所以32 * 4 /8 =16字节,这是在数据存储层面的。
而查出来的GUID是根据数据加上连接符组成的特定“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”格式,所以字符数是36,这是表示层面的。

所以回到最上的SQL其实只是少了个转换而已,加上

Convert(varchar(36),n.RootId) as NodeId

即可,主要注意的是这边的Convert函数第一个参数定义的varchar必须是>=36的,不可以仅仅用varchar哦~

 



以上是关于SQL uniqueidentifier的主要内容,如果未能解决你的问题,请参考以下文章

SQL uniqueidentifier

SQL: 将int型转换为UNIQUEIDENTIFIER

SQL插入后,PHP返回ID [uniqueidentifier]

解决sql server保存对象字符串转换成uniqueidentifier失败的问题

在sql语句中,出现将字符串转换为 uniqueidentifier 时失败的错误

SQL Uniqueidentifier 和 hashbytes 与 c# 不匹配