日期:2014-05-18 浏览次数:20935 次
create table tb(no int identity(1,1),id as right('0000'+rtrim(no),5) ,name varchar(10))
insert into tb select 'aa' union select 'bb'
select * from tb
/*
no          id         name
----------- ---------- ----------
1           00001      aa
2           00002      bb
(2 行受影响)
------解决方案--------------------
if object_id('tb') is not null
   drop table tb
go
if object_id('uf_id') is not null
   drop function uf_id
go
--创建一个获取最大值的自定义函数
create function uf_id()
returns varchar(10)
as
begin
  declare @id varchar(10)
  select @id=isnull(max(id)+1,1) from tb
  return(@id)
end
go
create table tb
(
 id varchar(10) default dbo.uf_id(),  --默认值设置为自定义函数
 name varchar(10)
)
go
insert into tb(name) values ('张三')
insert into tb(name) values ('李四')
insert into tb(name) values ('王五')
select * from tb
/*
id         name
---------- ----------
1          张三
2          李四
3          王五
(3 行受影响)
*/
------解决方案--------------------
--下面的代码生成长度为8的编号,编号以BH开头,其余6位为流水号。
--得到新编号的函数
CREATE FUNCTION f_NextBH()
RETURNS char(8)
AS
BEGIN
    RETURN(SELECT 'BH'+RIGHT(1000001+ISNULL(RIGHT(MAX(BH),6),0),6) FROM tb WITH(XLOCK,PAGLOCK))
END
GO
--在表中应用函数
CREATE TABLE tb(
BH char(8) PRIMARY KEY DEFAULT dbo.f_NextBH(),
col int)
--插入资料
BEGIN TRAN
    INSERT tb(col) VALUES(1)
    INSERT tb(col) VALUES(2)
    INSERT tb(col) VALUES(3)
    DELETE tb WHERE col=3
    INSERT tb(col) VALUES(4)
    INSERT tb(BH,col) VALUES(dbo.f_NextBH(),14)
COMMIT TRAN
--显示结果
SELECT * FROM tb
/*--结果
BH         col 
---------------- ----------- 
BH000001  1
BH000002  2
BH000003  4
BH000004  14
--*/