【问题标题】:Convert varchar to uniqueidentifier in SQL Server在 SQL Server 中将 varchar 转换为 uniqueidentifier
【发布时间】:2010-11-26 06:46:04
【问题描述】:

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

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

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

结果:

消息 8169,第 16 级,状态 2,第 1 行
从字符串转换为唯一标识符时转换失败。

使用连字符唯一标识符的相同查询工作正常,但数据未以该格式存储。

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

【问题讨论】:

  • 只有一行字符和数字实际上不是有效的 GUID 表示 - 您必须求助于 Quassnoi 在他的回答中显示的字符串解析魔法。

标签: sql sql-server-2005 uniqueidentifier


【解决方案1】:
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)

【讨论】:

  • 我真的希望这不是解决方案,但我想我们很快就会发现......
  • DECLARE @u uniqueidentifier SELECT @u = CONVERT(uniqueidentifier, 'c029f8be-29dc-41c1-8b38-737b4cc5a4df') *** 这样就足够了。刚刚试了一下。
  • 哦,是的!那我不得不同意。显而易见的是将连字符放在正确的位置,然后您就可以开始了!对不起!
  • 将这个 sn-p 放在一个函数中是对您的工具包的一个很好的补充,特别是因为一些 JSON 序列化程序在序列化时会从 GUID 中删除破折号,这使得将粘贴复制到 SQL 中进行调试变得更加困难。跨度>
【解决方案2】:

你的 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))

【讨论】:

    【解决方案3】:

    这将是一个方便的功能。另外,请注意我使用的是 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
    

    【讨论】:

    • 对 Stuff() 的出色使用。我只需要使用您的方法在 Select 语句中引用我的字段一次。不过我避免使用标量函数,因为它们并不总是很好地“缩放”,所以我把它写出来。谢谢,这在我的代码片段中!
    【解决方案4】:

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

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

    【讨论】:

    • 这如何回答将不带连字符的 varchar 转换为 GUID 的问题?这段代码所做的就是打印 1。
    【解决方案5】:
    SELECT CONVERT(uniqueidentifier,STUFF(STUFF(STUFF(STUFF('B33D42A3AC5A4D4C81DD72F3D5C49025',9,0,'-'),14,0,'-'),19,0,'-'),24,0,'-'))
    

    【讨论】:

      猜你喜欢
      • 2010-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多