在SQL Server中将varchar转换为uniqueidentifier

gre*_*ade 97 sql sql-server-2005 uniqueidentifier

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

我想将这些转换为SQL中的uniqueidentifier,以便传递给.Net Guid.但是,以下查询行不适合我:

select cast('a89b1acd95016ae6b9c8aabb07da2010' as uniqueidentifier)
select convert(uniqueidentifier, 'a89b1acd95016ae6b9c8aabb07da2010')
Run Code Online (Sandbox Code Playgroud)

并导致:

Msg 8169, Level 16, State 2, Line 1
Conversion failed when converting from a character string to uniqueidentifier.

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

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

Qua*_*noi 121

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)
Run Code Online (Sandbox Code Playgroud)

  • DECLARE @u uniqueidentifier SELECT @u = CONVERT(uniqueidentifier,'c029f8be-29dc-41c1-8b38-737b4cc5a4df')***这就足够了.刚试了一下. (21认同)
  • @Fabio:请仔细阅读这个问题. (10认同)
  • 我真的希望这不是解决方案,但我想我们很快就会发现...... (9认同)

Haf*_*hor 26

这将是一个方便的功能.另外,请注意我使用的是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
Run Code Online (Sandbox Code Playgroud)

  • 很好地使用Stuff().我只需要使用您的方法在Select语句中引用我的字段一次.我避免使用标量函数,因为它们并不总是很好地"缩放",所以我把它写出来.谢谢,这是我的Code Snippits! (3认同)

man*_*nji 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))
Run Code Online (Sandbox Code Playgroud)


小智 7

SELECT CONVERT(uniqueidentifier,STUFF(STUFF(STUFF(STUFF('B33D42A3AC5A4D4C81DD72F3D5C49025',9,0,'-'),14,0,'-'),19,0,'-'),24,0,'-'))
Run Code Online (Sandbox Code Playgroud)