【原创】SQLSERVER 通过 newsequentialid() 获取有序Guid 的注意事项

SQL SERVER 2005版本开始,支持获取有序Guid,函数为:newsequentialid(),使用该函数注意事项:

1、表存在对应类型:uniqueidentifier,可以设置 default 为:newsequentialid() 来自动生成有序Guid

2、字段类型为:uniqueidentifier时,值只能是36位有效格式的字符串,不能为其他格式或空的字符串,而且  SQL语句中不能这样比较:  FieldName = '',需要转换类型才可以,如:cast(FieldName as char(36)) = ''

3、父子表建立关系时,如果父表字段是 uniqueidentifier类型,则子表字段也必须是uniqueidentifier类型,如果子表该字段允许空,则只能设置为允许NULL,内容不能是空字符串。
     即:uniqueidentifier类型的字段作为主键时,如果是另一个表的副键,则另一个表的副键也必须是uniqueidentifier类型。

4、SQLSERVER 2008R2 SP3 版本 SMSS 界面中创建关系并保存时,uniqueidentifier类型字段如果存在默认值 :newsequentialid(),会提示错误,且无法保存。

(关于 newsequentialid() 函数更多特点,网上资料很多,这里不再重复赘述)

综合上述分析,最终建议:

1、创建有序Guid字段,可以设置 类型为 char(36)

2,然后通过存储过程或直接代码的形式获取 有序Guid:

alter procedure [dbo].[pro_uuid] 
@Result char(36) output
as
begin
   declare @uuid table (cid uniqueidentifier default newsequentialid(),name char(1))
   insert into @uuid(name) values('')
   select @Result = cid from @uuid
end

-- 调用:

declare @uuid char(36)
exec dbo.pro_uuid @uuid output
select @uuid

以上分析环境为:SQLSERVER 2008R2 SP3 版本,更高版本未作测试。

 最后修正:只有 uniqueidentifier类型 才是有序的,如果是 char(36) ,间断操作,查询时发现不是有序。

posted @ 2023-04-15 10:34  深海澜鲸  阅读(352)  评论(0编辑  收藏  举报