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哦~

 

转载于:https://www.cnblogs.com/cn2018/p/8915641.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值