问题 从UniqueIdentifier转换为BigInt和Back?


declare @uu uniqueidentifier =  'C50B0567-F8CC-4219-A1E1-91C97BD9AE1B'
select @uu
declare @zaza bigint = ( select convert(bigint, convert (varbinary(8), @uu, 1)) )
select @zaza
select CONVERT( uniqueidentifier , convert( varbinary(16) , @zaza , 1 ) )

我以为我有一种快速的方法将唯一标识符值转换为Big Int,然后返回。但是我的第二次转换存在问题。任何人都可以评论将GUID完全转换为数字并返回的正确方法吗?当我尝试将其从数字表示转换回原始GUID时,我只获取GUID的一部分而不是整个部分。

我想传递一个整数(我认为它将被归类为MSSQL中的“大BigInt”?)到远程系统并只使用字符0-9,并且仍然获得NewId()的随机唯一性。


10058
2018-04-09 18:56


起源

uniqueidentifier 是16个字节。一个 bigint 只有8.这是行不通的。你为什么要这样做? - Martin Smith
这样的转换意味着什么? - Oded
我再次编辑原始问题来解决这个问题,我需要与一个采用数字而不是字母数字代码的系统交换数据,并认为看起来不像GUID的GUID会起作用。 - Snowy
我有这个案子只是转向我,扭曲。我需要将一个四字节整数转换为GUID然后再转换回来。截断是一个非问题,因为它不是作为GUID开始的。 - Joshua


答案:


你的第二次转换没有问题。当我在SQL管理工作室中运行SQL语句时,我得到:

------------------------------------
C50B0567-F8CC-4219-A1E1-91C97BD9AE1B

(1 row(s) affected)


--------------------
7423352504965404994

(1 row(s) affected)


------------------------------------
C50B0567-F8CC-4219-0000-000000000000

(1 row(s) affected)

由于您要将8字节值转换为16字节guid,因此guid的一半将为零,这正是您所看到的。


13
2018-04-09 19:38