SQL Serverでvarcharをuniqueidentifierに変換する


104

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

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

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

結果:

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

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

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


文字と数字の列だけは実際には有効なGUID表現ではありません。Quassnoiが彼の回答で示したように、文字列解析の魔法に頼らなければなりません。
marc_s 2009

回答:


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
DECLARE @u uniqueidentifier SELECT @u = CONVERT(uniqueidentifier、 'c029f8be-29dc-41c1-8b38-737b4cc5a4df')***これで十分です。試してみただけです。
Fabio Milheiro、2011

そうそう!その後、私は同意する必要があります。明らかなことは、ハイフンを適切な場所に配置することであり、これで準備が整います。ごめんなさい!
ファビオミルヘイロ

このスニペットを関数に配置すると、ツールキットに追加できます。特に、一部のJSONシリアライザーはシリアル化時にGUIDからダッシュを削除するため、デバッグのためにSQLにコピーして貼り付けることが難しくなります。
David Cumps 2013年

27

それは便利な機能になります。また、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

4
Stuff()の優れた使用法。メソッドを使用して、Selectステートメントでフィールドを1回参照するだけで済みます。ただし、スカラー関数は常に十分に「スケーリング」できるとは限らないため、書きません。おかげで、これは私のコードの抜粋で起こっています!
MikeTeeVee 2013年

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.