我需要创建一个包含短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))
但我仍然遇到同样的错误。
答案 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)