--下面的代码生成长度为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
--显示结果
SELECT * FROM tb
/*--结果
BH col
---------------- -----------
BH000001 1
BH000002 2
BH000003 4
BH000004 14
--*/
create table tb
(id int identity,
name varchar(10),
code as 'BH'+right('0000'+cast(id as varchar),5))
go
insert tb(name) select 'A'
union all select 'B'
union all select 'C'
union all select 'D'
select * from tb
drop table tb
/*
id name code
----------- ---------- ------------
1 A BH00001
2 B BH00002
3 C BH00003
4 D BH00004
(所影响的行数为 4 行)
*/
#2
我只需要实现主键列ID在不是标识的情况下,实现自动增长
#3
LZ 可否使用计算列。添加一个标识列,然后用计算列的方式实现递增的自设定字段。
#4
利用储发器 set id=max(id)+1
#5
该回复于2011-07-05 11:23:32被版主删除
#6
假如我的建立了一个标识列ID2,那么ID该如何利用存储过程来计算出来呢?
比如目前表为 ID name ID2(标识列)
1 张三 1
2 李四 2
我插入第三条数据 null 王五 3
现在要在我插入第三条数据时或者一次加多条数据时让ID能自动的根据ID2来填上
请给出相关存储过程。
#7
create table tb(id int identity(1,1) not null,
col1 nvarchar(10) not null,
not_identity int not null PRIMARY KEY
)
go
create procedure setidentity
(@col varchar(10))
as
begin
insert into tb select @col,isnull((select not_identity+1 from tb),1)
end
go
exec setidentity 'abcd'
exec setidentity 'efgh'
go
select * from tb
/*
id col1 not_identity
----------- ---------- ------------
1 abcd 1
2 efgh 2
(2 行受影响)
*/
drop table tb
drop procedure setidentity
#8
修正:
create table tb(id int identity(1,1) not null,
col1 nvarchar(10) not null,
not_identity int not null PRIMARY KEY
)
go
create procedure setidentity
(@col varchar(10))
as
begin
insert into tb select @col,isnull((select max(not_identity)+1 from tb),1)
end
go
exec setidentity 'abcd'
exec setidentity 'efgh'
exec setidentity 'ijkl'
go
select * from tb
/*
id col1 not_identity
----------- ---------- ------------
1 abcd 1
2 efgh 2
3 ijkl 3