変換

2009-09-07 4 views
79

にSQL Serverで、私は、スキーマのを制御することはできませんテーブルをUNIQUEIDENTIFIERするvarchar型は、フォーマット「a89b1acd95016ae6b9c8aabb07da2010」でuniqueidentifiersを格納VARCHAR(50)として定義された列が含まれています(なしハイフン)変換

私がしたいですそれらを.Net Guidに渡すためのSQLのuniqueidentifierに変換します。ただし、次のクエリの行が私のために動作しません。

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

をしての結果:

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

同じクエリをハイフン付きのuniqueidentifier作業罰金を使用したが、データはその形式で保存されていません。

これらの文字列をSQLのuniqueidentifierに変換する別の(効率的な)方法がありますか。 - 私は.Netコードでやりたいとは思わない。

+0

文字と数字だけの行は本当に有効なGUID表現ではありません - Quassnoiのような文字列解析魔法に頼らざるを得ないでしょう。 –

答えて

101
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) 
+6

私はこれが解決策ではないことを本当に望んでいましたが、すぐに見つかると思います。 – grenade

+16

DECLARE @u uniqueidentifier SELECT @u = CONVERT(uniqueidentifier、 'c029f8be-29dc-41c1-8b38-737b4cc5a4df')* **これで十分でしょう。ちょうどそれを試した。 –

+7

@ファビオ:より慎重に質問をお読みください。 – Quassnoi

15

あなたのvarchar型のコル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)) 
21

それは便利な機能になるだろう。また、私は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 
+2

Stuff()の優れた使用。私はあなたのメソッドを使用してSelectステートメントで一度自分のフィールドを参照する必要があります。私はScalar-Functionsを避けています。なぜなら、それらは常に「スケール」がよくないので、私はそれを書きます。ありがとう、これは私のコードスニペットに行く! – MikeTeeVee

0

文字列に特殊文字が含まれている場合、md5にハッシュしてからguid/uniqueidentifierに変換できます。

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

これは、入力文字列を完全に異なるGUIDに変換します – Aaroninus

-3

あなたはguidが正しい形式ではありません(.net提供ガイド)。

は がキャッチ 印刷を開始してみてください ます。select convert(UNIQUEIDENTIFIER、 'a89b1acd95016ae6b9c8aabb07da2010') エンドを試し始める '1' エンドキャッチを

+1

これは、ハイフンなしでvarcharをGUIDに変換する方法にどのように回答しますか?このコードはすべてprint 1です。 – Aaroninus

4
SELECT CONVERT(uniqueidentifier,STUFF(STUFF(STUFF(STUFF('B33D42A3AC5A4D4C81DD72F3D5C49025',9,0,'-'),14,0,'-'),19,0,'-'),24,0,'-'))