SQL Server中的短GUID /从字符串转换为uniqueidentifier

时间:2015-03-07 15:27:30

标签: sql-server guid

我需要创建一个包含短guid的列。所以我发现了这样的事情:

alter table [dbo].[Table]
add InC UNIQUEIDENTIFIER not null default LEFT(NEWID(),6)

但我收到错误:

  

从字符串转换为uniqueidentifier时转换失败。

我一直在尝试

LEFT(CONVERT(varchar(36),NEWID()),6)

CONVERT(UNIQUEIDENTIFIER,LEFT(CONVERT(varchar(36),NEWID()),6))

但我仍然遇到同样的错误。

3 个答案:

答案 0 :(得分:3)

没有"短指导"。 Guid或uniqueidentifier是一个16字节的数据类型。你可以阅读它in MSDN。这意味着长度必须始终为16个字节,并且您不能使用6个字符。

在同一篇MSDN文章中,您可以找到有关如何初始化此类型的说明:

  

uniqueidentifier数据类型的列或局部变量可以是   通过以下方式初始化为值:

     
      
  • 使用NEWID功能。
  •   
  • 通过xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx格式的字符串常量转换,其中每个x为一个
      十进制数字,范围为0-9或a-f。例如,
      6F9619FF-8B86-D011-B42D-00C04FC964FF是一个有效的uniqueidentifier

      值。
  •   

在你的情况下,你试图只将6个字符转换为显然失败的uniqueidentifier

如果您只想使用6个字符,请使用varchar(6)

alter table [dbo].[Table]
add InC varchar(6) not null default LEFT(NEWID(),6)

请记住,在这种情况下,此guid不保证是唯一的。

答案 1 :(得分:1)

我刚做完这个,是因为我在互联网上找不到很好的答案。

请记住,这是一个128位值的64位表示形式,因此它具有真实GUID所具有的两倍的碰撞可能性。不处理0。

函数采用一个NEWID值:6A10A273-4561-40D8-8D36-4D3B37E4A19C

,并将其缩短为:7341xIlZseT

DECLARE @myid uniqueidentifier= NEWID()
select @myid
DECLARE @bigintdata BIGINT = cast(cast(reverse(NEWID()) as varbinary(max)) as bigint)
DECLARE @charSet VARCHAR(70) = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
DECLARE @cBase int = LEN(@charSet)
DECLARE @sUID varchar(22) = ''
DECLARE @x int

WHILE (@bigintdata <> 0)
BEGIN 
    SET @x = CAST(@bigintdata % @cBase as INT) + 1
    SET @bigintdata = @bigintdata / @cBase
    SET @sUID = SUBSTRING(@charSet, @x, 1) + @sUID;
END

SELECT @sUID

答案 2 :(得分:1)

使用CRYPT_GEN_RANDOM代替NEWID可以改善字符串的随机分布。

SELECT LEFT(CAST(CAST(CRYPT_GEN_RANDOM(16) AS UNIQUEIDENTIFIER) AS VARCHAR(50)), 6)