119

スキーマを制御できないテーブルには、varchar(50)として定義された列が含まれています。この列には、一意の識別子が「a89b1acd95016ae6b9c8aabb07da2010」(ハイフンなし)の形式で格納されます。

.Net Guidに渡すために、これらをSQLで一意の識別子に変換したいと思います。ただし、次のクエリ行は機能しません。

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

結果は次のようになります。

メッセージ8169、レベル16、状態2、行1
文字列からuniqueidentifierへの変換時に変換に失敗しました。

ハイフンでつながれたuniqueidentifierを使用した同じクエリは正常に機能しますが、データはその形式で保存されません。

これらの文字列をSQLで一意の識別子に変換する別の(効率的な)方法はありますか?--.Netコードでは実行したくありません。

4

5 に答える 5

139
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)
于 2009-09-07T16:36:11.647 に答える
28

便利な機能になります。また、SUBSTRING の代わりに STUFF を使用していることにも注意してください。

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
于 2013-06-25T23:52:15.370 に答える
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))
于 2009-09-07T16:37:08.463 に答える
13
SELECT CONVERT(uniqueidentifier,STUFF(STUFF(STUFF(STUFF('B33D42A3AC5A4D4C81DD72F3D5C49025',9,0,'-'),14,0,'-'),19,0,'-'),24,0,'-'))
于 2016-07-19T10:15:22.570 に答える
-7

提供された GUID の形式が正しくありません (.net 提供の GUID)。

begin try
select convert(uniqueidentifier,'a89b1acd95016ae6b9c8aabb07da2010')
end try
begin catch
print '1'
end catch
于 2015-01-13T09:52:44.930 に答える