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插入后,PHP返回ID [uniqueidentifier]
解决sql server保存对象字符串转换成uniqueidentifier失败的问题