【原创】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 @   深海澜鲸  阅读(396)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤
点击右上角即可分享
微信分享提示