您想要增加 Guid 的方式对于 SQL Server 是不正确的,因为 Guid 是一个在字节组中具有不同字节顺序的结构,请查看:
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 子句的角度来看]。
这里有一个简单的函数来增加一个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 版本位。
但正如其他人指出的那样,您真的不应该这样做。在您的情况下,为这些 Guid 创建一个临时表可能会更好(有两列:一个整数作为索引,第二个带有生成的 Guid)。