SQL Server中的短GUID / 将字符转换为唯一标识符

3

我需要创建一个包含短GUID的列。所以我找到了以下代码:

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

但是我遇到了错误:
转换失败,从字符字符串转换为唯一标识符。
我一直在尝试。
LEFT(CONVERT(varchar(36),NEWID()),6)

并且

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

但我仍然收到相同的错误提示。

我需要一个只包含六个符号的guid。 - undefined
或者我应该给这个列设置varchar类型。这样做好吗? - undefined
4个回答

5
没有所谓的“短GUID”。GUID或uniqueidentifier是一种16字节的数据类型。您可以在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不能保证是唯一的。

我明白了。非常感谢你的回答。还有,你知道在C#中有没有办法创建短GUID吗? - undefined
@Tatyana,如果这篇帖子回答了你的问题,你可以标记一下。 - undefined

2

使用CRYPT_GEN_RANDOM而不是NEWID可以提高字符串的随机分布。

最初的回答:

Using CRYPT_GEN_RANDOM instead of NEWID can improve random distribution of the string.

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


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

这个能够反向转换成相同的GUID吗?如果可以的话,能给一个例子吗? - undefined

0
我阅读了所有的答案,并使用了"CrimsonMoose"的答案来解决我的问题。在修改他们的代码并使其可用后,我得到了以下的代码:
CREATE OR ALTER VIEW GUIDView AS SELECT [GUID]=NEWID()
GO
CREATE OR ALTER FUNCTION dbo.CreateCompressedGUID()
RETURNS VARCHAR(11)
BEGIN
    DECLARE @result         VARCHAR(22) = '';
    DECLARE @keyGUID        BIGINT;
    DECLARE @resultChars    VARCHAR(70) = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    DECLARE @division       INT = LEN(@resultChars)
    DECLARE @divisionRemained int;
    SELECT @keyGUID=CAST(CAST(REVERSE([GUID]) AS VARBINARY(MAX)) AS BIGINT) FROM GUIDView

    WHILE (@keyGUID <> 0)
    BEGIN 
        SET @divisionRemained = @keyGUID % @division;
        SET @divisionRemained = @divisionRemained + 1;
        SET @keyGUID = @keyGUID / @division;
        SET @result = SUBSTRING(@resultChars,@divisionRemained,1) + @result;
    END;

    RETURN @result;
END;
GO
SELECT Example = dbo.CreateCompressedGUID()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接