【原创】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) ,间断操作,查询时发现不是有序。