在项目中遇到一个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哦~
原文地址:https://www.cnblogs.com/cn2018/p/8915641.html
时间: 2024-10-29 06:52:51