2009-05-04 4 views
1

저는 TSQL에서 uniqueidentifier를 1 씩 증가시키는 방법을 찾고 있습니다. 예를 들어 ID가 A6BC60AD-A4D9-46F4-A7D3-98B2A7237A9E 인 경우 A6BC60AD-A4D9-46F4-A7D3-98B2A7237A9F를 선택할 수 있기를 바랍니다.TSQL에서 uniqueidentifier를 증가 시키십시오.

@rein 데이터 가져 오기 용입니다. 우리는 레코드를 생성하는 ID를 가진 중간 테이블을 가지고 있으며 나중에 가져 오기에서이 ID에 참여합니다. 불행히도, 이제 이러한 레코드 중 일부는 다음 테이블에 몇 가지 레코드를 생성하므로 재사용 가능한 새로운 ID가 필요합니다.

+2

나는 이것이 정말로 필요한 이유를 아는 것에 정말로 관심이 있습니다. – rein

+2

GUID를 증가시켜야하는 상황에 처한 경우 10 번에서 9 번 시도하면 무엇을하려고하는지 다시 검사하게됩니다. –

+2

GUID를 증가시키는 대신에, 추가 시퀀스 열을 추가하여 명확성을 제거하는 것이 더 간단할까요? – ahains

답변

1

여기에 나와있는 한 가지 방법이 있지만 더 좋은 방법이 있기를 바라고 있습니다.

LEFT([ID], 19) + RIGHT(CONVERT(uniqueidentifier, CONVERT(binary(16), CONVERT(binary(16), [ID]) + CONVERT(bigint, 1))), 17) AS 'MyNewID' 
+1

SQL Server의 어떤 버전입니까? 2005 및 2008은 데이터 함수로 uniqueidentifiers를 증가 시켰습니다. - NEWSEQUENTIALID() – u07ch

+0

나는 내 대답이기를 희망했지만, 불행히도 쿼리에서는 사용할 수 없습니다. –

+0

clr을 사용할 수 있다면 이것을 시도 할 수 있습니다. http://www.jorriss.net/blog/jorriss/archive/2008/04/24/unraveling-the-mysteries-of-newsequentialid.aspx – u07ch

1

이 접근법을 사용할 수 있지만 하위 8 바이트가 넘칠 경우를 고려하지 않습니다.

declare @guid uniqueidentifier, @binaryUpper8 binary(8), @binaryLower8 binary(8), @binary16 binary(16), @bigint bigint 
set @guid = 'A6BC60AD-A4D9-46F4-A7D3-98B2A7237A9E' 
set @binary16 = cast(@guid as binary(16)) 

--harvest lower 8 bytes 
select @binaryUpper8= substring(0xAD60BCA6D9A4F446A7D398B2A7237A9E, 1, 8) 
    ,@binaryLower8 = substring(0xAD60BCA6D9A4F446A7D398B2A7237A9E, 9, 8) 
set @bigint = cast(@binaryLower8 as bigint) 

--increment 
set @bigint = @bigint + 1 

--convert back 
set @binaryLower8 = cast(@bigint as binary(8)) 
set @binary16 = @binaryUpper8 + @binaryLower8 
set @guid = cast(@binary16 as uniqueidentifier) 
select @guid 
4

당신이 GUID를 바이트 그룹의 다른 바이트 순서와 구조이기 때문에 GUID를 SQL Server에 대한 정확하지 증가 할 방법, 한 번 봐 가지고하십시오 http://sqlblog.com/blogs/alberto_ferrari/archive/2007/08/31/how-are-guids-sorted-by-sql-server.aspx 을하고 다음주의 사항 :

변경된 Alberto의 쿼리를 실행하면 다음 시퀀스가 ​​표시됩니다. 3, 2, 1, 0, 5, 4, 7, 6, 9, 8, 15, 14, 13, 12, 11, 10

즉, 해당 GUID의 바이트 # 3은 GUID의 바이트 # 10은 가장 중요한 [SQL Server ORDER BY 절의 관점에서 볼 때] 중요합니다. 6 바이트 그들이 가이 버전 비트를 포함 7로 증가하지

create function [dbo].[IncrementGuid](@guid uniqueidentifier) 
returns uniqueidentifier 
as 
begin 
declare @guid_binary binary(16), @b03 binary(4), @b45 binary(2), @b67 binary(2), @b89 binary(2), @bAF binary(6) 

select @guid_binary = @guid 

select @b03 = convert(binary(4), reverse(substring(@guid_binary,1,4))) 
select @b45 = convert(binary(2), reverse(substring(@guid_binary,5,2))) 
select @b67 = convert(binary(2), reverse(substring(@guid_binary,7,2))) 
select @b89 = convert(binary(2), substring(@guid_binary,9,2)) 
select @bAF = convert(binary(6), substring(@guid_binary,11,6)) 

if (@b03 < 'FFFFFFFF') 
begin 
    select @b03 = convert(binary(4), cast(@b03 as int) + 1) 
end 
else if (@b45 < 'FFFF') 
begin 
    select @b45 = convert(binary(2), cast(@b45 as int) + 1) 
end 
else if (@b89 < 'FFFF') 
begin 
    select @b89 = convert(binary(2), cast(@b89 as int) + 1) 
end 
else 
begin 
    select @bAF = convert(binary(6), cast(@bAF as bigint) + 1) 
end 

return convert(binary(16), reverse(convert(char(4),@b03)) + reverse(convert(char(2),@b45)) + reverse(convert(char(2),@b67)) + convert(char(2),@b89) + convert(char(6),@bAF)) 
end 

주 : 여기

이 차지하는 고유 식별자를 증가 간단한 함수이다. 하지만 다른 사람들이 당신을 가리키고 있습니다. 이 아니어야합니다. 귀하의 경우에는이 Guids에 대한 임시 테이블을 만드는 것이 더 좋을 수 있습니다 (두 개의 열이 있습니다 : 하나의 정수를 인덱스로 생성하고 두 번째 인덱스를 생성 된 Guids와 함께 사용).

관련 문제