将varchar转换为SQL Server中的uniqueidentifier


104

我无法控制该模式的表包含一个定义为varchar(50)的列,该列以'a89b1acd95016ae6b9c8aabb07da2010'格式存储唯一标识符(无连字符)

我想将这些转换为SQL中的uniqueidentifiers,以传递给.Net Guid。但是,以下查询行对我不起作用:

select cast('a89b1acd95016ae6b9c8aabb07da2010' as uniqueidentifier)
select convert(uniqueidentifier, 'a89b1acd95016ae6b9c8aabb07da2010')

并导致:

讯息8169,第16级,州2,第1行
从字符串转换为uniqueidentifier时转换失败。

使用带连字符的uniqueidentifier的相同查询可以正常工作,但数据不会以该格式存储。

还有另一种(有效的)方法可以将这些字符串转换为SQL中的uniqueidentifiers。-我不想在.Net代码中这样做。


仅一行字符和数字实际上不是有效的GUID表示-您将不得不诉诸Quassnoi在其答案中所示的字符串解析魔术。
marc_s

Answers:


126
DECLARE @uuid VARCHAR(50)
SET @uuid = 'a89b1acd95016ae6b9c8aabb07da2010'
SELECT  CAST(
        SUBSTRING(@uuid, 1, 8) + '-' + SUBSTRING(@uuid, 9, 4) + '-' + SUBSTRING(@uuid, 13, 4) + '-' +
        SUBSTRING(@uuid, 17, 4) + '-' + SUBSTRING(@uuid, 21, 12)
        AS UNIQUEIDENTIFIER)

10
我真的希望这不是解决方案,但我想我们会尽快发现……
手榴弹

22
声明@u uniqueidentifier选择@u = CONVERT(uniqueidentifier,'c029f8be-29dc-41c1-8b38-737b4cc5a4df')***这足够了。刚刚尝试过。
Fabio Milheiro 2011年

哦,是的!那我必须同意。显而易见的是将连字符放在正确的位置,您就可以开始使用!抱歉!
Fabio Milheiro 2011年

将此代码段放入函数中是对工具包的不错补充,特别是因为某些JSON序列化程序在进行序列化时会从GUID中删除破折号,因此很难将粘贴复制到SQL中进行调试。
大卫坎普斯

27

它会带来方便的功能。另外,请注意,我使用的是STUFF而不是SUBSTRING。

create function str2uniq(@s varchar(50)) returns uniqueidentifier as begin
    -- just in case it came in with 0x prefix or dashes...
    set @s = replace(replace(@s,'0x',''),'-','')
    -- inject dashes in the right places
    set @s = stuff(stuff(stuff(stuff(@s,21,0,'-'),17,0,'-'),13,0,'-'),9,0,'-')
    return cast(@s as uniqueidentifier)
end

4
很好地使用Stuff()。我只需要使用您的方法在Select语句中引用我的字段一次。但是我避免使用标量函数,因为它们并不总是能很好地“缩放”,因此我将其写出来。谢谢,这正在我的代码片段中!
MikeTeeVee

18

您的varchar col C:

SELECT CONVERT(uniqueidentifier,LEFT(C, 8)
                                + '-' +RIGHT(LEFT(C, 12), 4)
                                + '-' +RIGHT(LEFT(C, 16), 4)
                                + '-' +RIGHT(LEFT(C, 20), 4)
                                + '-' +RIGHT(C, 12))

10
SELECT CONVERT(uniqueidentifier,STUFF(STUFF(STUFF(STUFF('B33D42A3AC5A4D4C81DD72F3D5C49025',9,0,'-'),14,0,'-'),19,0,'-'),24,0,'-'))

-4

如果您的字符串包含特殊字符,则可以将其哈希到md5,然后将其转换为guid / uniqueidentifier。

SELECT CONVERT(UNIQUEIDENTIFIER, HASHBYTES('MD5','~öü߀a89b1acd95016ae6b9c8aabb07da2010'))

8
这会将输入字符串转换为完全不同的GUID
Aaroninus

-6

提供的guid格式不正确(.net提供的guid)。

begin try
select convert(uniqueidentifier,'a89b1acd95016ae6b9c8aabb07da2010')
end try
begin catch
print '1'
end catch

6
这如何回答将不带连字符的varchar转换为GUID的问题?所有这些代码所做的就是打印1
Aaroninus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.