日期:2014-05-18 浏览次数:20457 次
create table aa(id varchar(10) ) declare @n int declare @v varchar(100) set @n=3 zhai: select @v=left(rand()*1000000,@n) if not exists(select 1 from aa where id=@v) begin insert into aa select @v end else begin goto zhai end select * from aa 920 695 288 869 432 779 452
------解决方案--------------------
实现你的要求很好用,但是如果规定是整型的数,并且用rand随机生成的,则重复的概率很大的,不可能作为主键用的,你可以用自增的数字,或者你可以用三位字符串,字符串是由字母和数字组成。
给个随机的
declare @n int set @n=3 if @n=3 begin select cast((1000)*rand(checksum(newid())) as int) --三位 end if @n=4 begin select cast((10000)*rand(checksum(newid())) as int) --四位 end 如果字符与数字的组合 declare @n int set @n=3 if @n=3 begin select left(newid(),3) --三位 end if @n=4 begin select left(newid(),4) --四位 end
------解决方案--------------------
[code=SQL][/code]
--编号表
CREATE TABLE tb_NO(
Name char(2) PRIMARY KEY, --编号种类的名称
Head nvarchar(10) NOT NULL DEFAULT '', --编号的前缀
CurrentNo int NOT NULL DEFAULT 0, --当前编号
BHLen int NOT NULL DEFAULT 6, --编号数字部分长度
DESCRIPTION NVARCHAR(50)) --编号种类说明
INSERT tb_NO SELECT 'CG','CG',0,4,N'采购订单'
UNION ALL SELECT 'CJ','CJ',0,4,N'采购进货'
UNION ALL SELECT 'JC','JC',0,4,N'进仓单'
UNION ALL SELECT 'ZC','ZC',0,4,N'转仓单'
UNION ALL SELECT 'CC','CC',0,4,N'出仓单'
GO
--获取新编号的存储过程
CREATE PROC p_NextBH
@Name char(2), --编号种类
@BH nvarchar(20) OUTPUT --新编号
AS
BEGIN TRAN
UPDATE tb_NO WITH(ROWLOCK) SET
@BH=Head+RIGHT(POWER(10,BHLen)+CurrentNo+1,BHLen),
CurrentNo=CurrentNo+1
WHERE Name=@Name
COMMIT TRAN
GO
--获取 CJ 的新编号
DECLARE @bh char(6)
EXEC p_NextBH 'CJ',@bh OUT
SELECT @bh
--结果: CJ0001
EXEC p_NextBH 'CJ',@bh OUT
SELECT @bh
--结果: CJ0002
GO
--获取 CC 的新编号
DECLARE @bh char(6)
EXEC p_NextBH 'CC',@bh OUT
SELECT @bh
--结果: CC0001
EXEC p_NextBH 'CC',@bh OUT
SELECT @bh
--结果: CC0002