有时候我们希望 Id 要好看一些,比如 Id=1 -> Id=T000001
refer :
http://www.kodyaz.com/t-sql/custom-sequence-string-as-sql-identity-column.aspx
http://www.sqlteam.com/article/custom-auto-generated-sequences-with-sql-server
方法有很多,我目前选择的方式是使用触发器在插入之后更新
我们把这个好看一点的Id称为 viewId 吧。
先做一个方法来格式化Id
调用 viewId = dbo.getViewId('T',CAST(inserted.Id as nvarchar(50)),6,'0');
drop function dbo.getViewId;create function [dbo].[getViewId] ( @Prefix nvarchar(10), @Id int, @Length int, @PaddingChar char(1) = '0')returns nvarchar(MAX)asbeginreturn ( select @Prefix + RIGHT(REPLICATE(@PaddingChar, @Length) + CAST(@Id as nvarchar(10)), @Length))end
针对某个表写入触发器逻辑
drop trigger OrdersAfterInsert;create trigger OrdersAfterInsert on [dbo].[Orders] for insertas update Orders set viewId = dbo.getViewId('O', CAST(inserted.Id as nvarchar(50)),6,'0') from Orders inner join inserted on Orders.Id= inserted.Id; go
如果表已经存在数据的话,要更新哦
update Orders set viewId = dbo.getViewId('O', CAST(Id as nvarchar(50)),6,'0');
创建column and UNIQUE
alter table Orders add viewId nvarchar(50) null;create unique nonclustered index [UNIQUE_Orders_viewId] on [dbo].[Orders]([viewId] asc) where ([viewId] IS NOT NULL AND [viewId] IS NOT NULL);
使用 Entity Framewrok的话可以把这个数据标签为 Computed.
public class Order{ [Key] public int Id { get; set; } [DatabaseGenerated(DatabaseGeneratedOption.Computed)] public string viewId { get; set; }}
以上.