在SQL Server中将varchar转换为uniqueidentifier

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

我想在SQL中将这些转换为uniqueidentifiers传递给.net guid。 但是,以下查询行不适用于我:

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

并导致:

  Msg 8169,Level 16,State 2,Line 1
从string转换为uniqueidentifier时转换失败。 

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

是否有另一种(有效的)方式将这些string转换为SQL中的uniqueidentifiers。 – 我不想用.Net代码来做。

 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) 

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

你的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)) 
 SELECT CONVERT(uniqueidentifier,STUFF(STUFF(STUFF(STUFF('B33D42A3AC5A4D4C81DD72F3D5C49025',9,0,'-'),14,0,'-'),19,0,'-'),24,0,'-')) 

如果你的string包含特殊字符,你可以把它散列到md5,然后把它转换成一个guid / uniqueidentifier。

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

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

开始尝试select转换(uniqueidentifier,'a89b1acd95016ae6b9c8aabb07da2010')结束尝试开始捕获打印'1'结束捕获