, как вы хотите, чтобы увеличить Guid не является правильным для SQL Server, как Guid представляет собой структуру с другой последовательностью байт в байт группы, пожалуйста, посмотрите на: http://sqlblog.com/blogs/alberto_ferrari/archive/2007/08/31/how-are-guids-sorted-by-sql-server.aspx и обратите внимание на следующее:
Теперь, когда я запускаю измененный запрос Альберто, я получаю следующую последовательность: 3, 2, 1, 0, 5, 4, 7, 6, 9, 8, 15, 14, 13, 12, 11, 10
Это означает, что байт GUID № 3 является наименьшим значением si gnificant и байт # 10 GUID является наиболее значительным [с точки зрения предложения ORDER BY SQL Server].
Вот простая функция прирастить UniqueIdentifier учета для этого:
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
Обратите внимание, что байты 6 и 7 не увеличивается, поскольку они содержат биты версии Guid. Но, как вы указали, вы действительно не должны делать это. В вашем случае было бы лучше, если бы вы создали временную таблицу для этих Гидов (с двумя столбцами: одно целое в качестве индекса и второе с созданными Гидами).
Мне было бы интересно узнать, зачем вам это нужно. – rein
Если вы оказались в ситуации, требующей увеличения GUID, в 9 раз из 10 я бы пересмотрел то, что вы пытаетесь сделать. –
Вместо того, чтобы увеличивать GUID, возможно, было бы проще просто добавить дополнительный столбец столбцов для устранения неоднозначности? – ahains