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

时间: 2024-10-29 06:52:51

SQL uniqueidentifier的相关文章

sql uniqueidentifier转varchar

--- DECLARE @myid uniqueidentifierSET @myid = NEWID()SELECT CONVERT(char(255), @myid) AS 'char';GO-- declare @allstring char(255),@AreaUid Uniqueidentifierset @AreaUid='37A1DA94-4AC6-4ED0-B96F-BA3FE6AEACC8'set @allstring= cast(@AreaUid as char(255))s

开发反模式(GUID) - 伪键洁癖

一.目标:整理数据 有的人有强迫症,他们会为一系列数据的断档而抓狂. 一方面,Id为3这一行确实发生过一些事情,为什么这个查询不返回Id为3的这一行?这条记录数据丢失了吗?那个Column到底是什么?我要为这条数据的丢失负责吗? 二.反模式:填充角落 大多数人对于断档的第一反应就是想要填补其中的空缺.对此,可能有两种做法: 1.不按照顺序分配编号 你可能想要在插入新行时,通过遍历表,将找到的第一个未分配的主键编号分配给新行,来代替原来自动分配的伪主键机制.随着你不断地插入新行,断档就被填补起来了

sql server中的TimeStamp时间戳与UniqueIdentifier数据类型

TimeStamp SQL Server timestamp 数据类型与时间和日期无关.SQL Server timestamp 是二进制数字,它表明数据库中数据修改发生的相对顺序.实现 timestamp 数据类型最初是为了支持 SQL Server 恢复算法.每次修改页时,都会使用当前的 @@DBTS 值对其做一次标记,然后 @@DBTS 加1.这样做足以帮助恢复过程确定页修改的相对次序,但是 timestamp 值与时间没有任何关系. 每个数据库都有一个计数器,当对数据库中包含 times

使用 SQL Server 的 uniqueidentifier 字段类型

原文:使用 SQL Server 的 uniqueidentifier 字段类型 SQL Server 自 2008 版起引入了?uniqueidentifier?字段,它存储的是一个 UUID, 或者叫 GUID,内部存储为 16 个字节.SQL Server 可用两个函数来生成?uniqueidentifier, 分别是?NEWID()?和?NEWSEQUENTIALID(), 后者只能用作字段的默认值.Java 也有一个 UUID 工具类?java.uti.UUID,?UUID.rando

SQL: 将int型转换为UNIQUEIDENTIFIER

DECLARE @I INT SELECT @I=123456 SELECT CAST(CAST(@I AS varbinary(16)) AS UNIQUEIDENTIFIER) SELECT CAST(CAST(@I AS binary(16)) AS UNIQUEIDENTIFIER) SELECT CAST(CAST(@I AS binary(4))+CAST(@I AS binary(4))+CAST(@I AS binary(4))+CAST(@I AS binary(4)) AS 

SQL Server 游标使用

1.声明游标            DECLARE 游标名 CURSOR SELECT语句(注:此处一定是SELECT语句)        2.打开游标           OPEN 游标名        3.读取游标数据           Fetch [Next | Prior | First | Last | Absolute n | Relative n ]  From 游标名 INTO @name1,@name2...            WHILE(@@FETCH_STATUS =

java实体属性对应mysql和SQL Server 和Oracle 数据类型对应

1:Java数据类型与MySql数据类型对照表 类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) VARCHAR L+N VARCHAR java.lang.String 12 CHAR N CHAR java.lang.String 1 BLOB L+N BLOB java.lang.byte[] -4 TEXT 65535 VARCHAR java.lang.String -1 INTEGER 4 INTEGER UNSIGNED java.lang.Long 4 T

MS SQL SERVER: msdb.dbo.MSdatatype_mappings &amp; msdb.dbo.sysdatatypemappings

--SQL转Oracle/DB2的类型对应关系SELECT *FROM msdb.dbo.MSdatatype_mappings; --MS SQL SERVER更详细得显示了ORACLE/DB2各个数据库系统的类型对应SELECT *FROM msdb.dbo.sysdatatypemappings; dbms_name sql_type dest_type dest_prec dest_create_params dest_nullable DB2 bigint DECIMAL 19 3 t

SQL Server 2014 日志传送部署(5):通过T-SQL命令来部署日志传送

13.2.5 通过T-SQL命令来部署日志传送 SQL Server还提供以T-SQL命令方式来部署日志传送.在上一个章节中当完成步骤(6)或者(8)后,可保存生成的命令脚本.这个脚本命令结果和在Management Studio中操作的结果是等价的,此命令脚本也可以使用在用户在灾难恢复方案中更快速的重新部署日志传送. 得到的命令脚本(带监视服务器): -- 在主服务器上执行下列语句,以便为数据库 [SQLSVR1].[DB01] -- 配置日志传送. -- 需要在主服务器上 [msdb] 数据