SQL Server에서 varchar를 uniqueidentifier로 변환


104

스키마를 제어 할 수없는 테이블에는 'a89b1acd95016ae6b9c8aabb07da2010'(하이픈 없음) 형식으로 고유 식별자를 저장하는 varchar (50)로 정의 된 열이 포함되어 있습니다.

.Net Guid에 전달하기 위해 SQL의 고유 식별자로 변환하고 싶습니다. 그러나 다음 쿼리 줄은 작동하지 않습니다.

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

결과 :

메시지 8169, 수준 16, 상태 2, 줄 1
문자열에서 uniqueidentifier로 변환 할 때 변환에 실패했습니다.

하이픈이있는 고유 식별자를 사용하는 동일한 쿼리는 제대로 작동하지만 데이터는 해당 형식으로 저장되지 않습니다.

이러한 문자열을 SQL의 고유 식별자로 변환하는 또 다른 (효율적인) 방법이 있습니까? -.Net 코드에서하고 싶지 않습니다.


문자와 숫자의 행은 실제로 유효한 GUID 표현이 아닙니다. Quassnoi가 대답에서 보여준 것과 같은 문자열 구문 분석 마법에 의존해야합니다.
marc_s

답변:


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

어 그래! 그럼 동의해야합니다. 분명한 것은 하이픈을 올바른 위치에 배치하는 것입니다. 죄송합니다!
Fabio Milheiro 2011

이 스 니펫을 함수에 배치하는 것은 툴킷에 좋은 추가 기능입니다. 특히 일부 JSON 직렬 변환기는 직렬화 할 때 GUID에서 대시를 제거하여 SQL에 붙여 넣기를 복사하여 디버깅하기 어렵 기 때문에 더욱 그렇습니다.
데이비드 Cumps

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 문에서 내 필드를 한 번만 참조하면됩니다. 하지만 스칼라 함수는 항상 "확장"되지 않기 때문에 피합니다. 그래서 그것을 작성합니다. 감사합니다. 이것은 제 코드 스 니핏에 있습니다!
MikeTeeVee

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.