要求:存储实现(开始序列,结束序列以参数格式传入)
格式:a+00000+00000
效果:a273837982736
位数:必需为13位.
备注:前6位取值范围在:1~1000000,后6位相同。
请您写出具体的执行时间,主要看下性能!
格式:a+00000+00000
效果:a273837982736
位数:必需为13位.
备注:前6位取值范围在:1~1000000,后6位相同。
请您写出具体的执行时间,主要看下性能!
CREATE VIEW v_RAND
AS
SELECT re=STUFF(RAND(),1,2,'')
GO--生成随机编号的函数
CREATE FUNCTION f_RANDBH(@BHLen int)
RETURNS varchar(50)
AS
BEGIN
DECLARE @r varchar(50)
IF NOT(ISNULL(@BHLen,0) BETWEEN 1 AND 50)
SET @BHLen=10lb_bh: --生成随机编号的处理
SELECT @r=re FROM v_RAND
WHILE LEN(@r)<@BHLen
SELECT @r=@r+re FROM v_RAND
SET @r=LEFT(@r,@BHLen) --检查编号在基础数据表中是否存在
IF EXISTS(SELECT * FROM tb WITH(XLOCK,PAGLOCK) WHERE BH=@r)
GOTO lb_bh RETURN(@r)
END
GO--创建引用生成随机编号的函数
CREATE TABLE tb(
BH char(10) PRIMARY KEY DEFAULT dbo.f_RANDBH(10),
col int)--插放数据
BEGIN TRAN
INSERT tb(col) VALUES(1)
INSERT tb(col) VALUES(2)
INSERT tb(col) VALUES(3)
COMMIT TRAN
SELECT * FROM tb
GO
/*--结果
BH col
------------------------------ -----------
6128177354 1
7378536177 3
8387186129 2
--*/
-------------------
a064292000000
a067725000000
a042489000000
a098195000000
a056485000000
a012298000000
a095519000000
a030735000000
a044837000000
a006882000000
a069965000000
a076144000000
a030517000000
a052038000000
a002597000000
a066496000000
a090172000000
a079261000000
a043104000000
a044985000000
a026916000000
a026515000000
a021480000000
a049513000000
a027940000000
a024029000000
a032799000000
a048102000000
a000767000000
a047208000000
a076057000000
a058679000000
a000773000000
a077784000000
a010372000000
a099735000000
a069071000000
a029982000000
a029392000000
a074079000000
a031458000000
a083793000000
a033478000000
a084187000000
a080009000000
a098666000000
a059253000000
a039793000000
a069922000000
a058666000000
a039827000000
a011526000000
a017195000000
a044569000000
a091554000000
a029068000000
a057962000000
a066328000000
a086863000000
a018733000000
a073598000000
a021810000000
a088508000000
a040650000000
a049385000000
a051572000000
a068757000000
a002262000000
a075846000000
a099745000000
a065933000000
a088885000000
a054647000000
a062497000000
a009195000000
a021735000000
a045914000000
a088464000000
a036538000000
a068063000000
a028188000000
a025369000000
a001533000000
a062896000000
a047811000000
a077243000000
a096961000000
a017666000000
a097694000000
a082262000000
a055357000000
a005825000000
a082968000000
a049755000000
a030628000000
a068371000000
a001203000000
a088951000000
a033627000000
a074575000000
a094204000000
a030406000000
a088668000000
a052801000000
a040677000000
a077050000000
a097147000000
a016804000000
a084571000000
a028345000000
a092565000000(所影响的行数为 111 行)*/
select 'a'+right(1000000+checksum(newid())%1000000,6)
+right(1000000+checksum(newid())%1000000,6)
/*
-------------------------
a973577475675(1 行受影响)
*/
/*
-------------------------
A297764439466(所影响的行数为 1 行)
*/
GO
CREATE PROC PROC_DATA
@START INT,
@END INT,
@OUT VARCHAR(6) OUTPUT
AS
SET @OUT= RIGHT('0000000'+LTRIM(CAST(RAND()*(@END-@START)+@START AS DECIMAL(38,0))),6)
GO
DECLARE @S VARCHAR(6)
EXEC PROC_DATA 1,6000,@S OUTPUT
SELECT @S
/*------
000492(影響 1 個資料列)*/
是以sp方式生成。
不过,结果不是我要的。
---------------
格式:a+00000+00000 -->如:a 8484743 373784 (从几开始到哪结束,取其间的随机数组合成6位码)
效果:a273837982736
位数:必需为13位.
请您写出具体的执行时间,主要看下性能!
--------------------
沒太理解8484743 是隨機生成的?
373784是固定的?
GO
CREATE PROC PROC_DATA
@START INT,
@END INT,
@OUT VARCHAR(13) OUTPUT
AS
SET @OUT= 'A'+RIGHT('000000'+LTRIM(CAST(RAND()*(@END-@START)+@START AS DECIMAL(38,0))),6)+'373784'
GO
DECLARE @S VARCHAR(13)
EXEC PROC_DATA 1,6000,@S OUTPUT
SELECT @S
/*
-------------
A005400373784(影響 1 個資料列)*/
有没有更好的解决方案:--输入参数:@StartID开始序号,@EndID结束序号
CREATE proc p_BuildActiveNum
(
@StartID int,
@EndID int
)
as
begin
declare @Width int, @Num varchar(15)
set @Width = 1000000
while (@StartID <= @EndID)
begin
set @Num = 'c' + right(cast(@Width + @StartID as varchar(10)), 6) + right(cast(rand() * @Width as int) + @Width, 6)
set @StartID = @StartID + 1
end
end
GO
如果startID输入为1.输入字符为:c
有endid为1000
则输出结果为:
6001 c000001220627 0
6002 c000002007785 0
6003 c000003208259 0
6004 c000004231146 0
6005 c000005222506 0
6006 c000006047301 0
6007 c000007981924 0
6008 c000008791100 0
6009 c000009858398 0
6010 c000010551717 0
6011 c000011826771 0
6012 c000012394611 0
6013 c000013946811 0
6014 c000014868826 0
6015 c000015798952 0
6016 c000016564765 0
6017 c000017172908 0
alter proc p_BuildActiveNum
(
@StartID nvarchar(1),
@EndID int
)
as
begin select top 10000 id = identity(int,600,1) into #1 from syscolumns a ,syscolumns b
select id
,code = @StartID + left(rand(id)* 1000000,6)+right('000000'+cast(@EndID as nvarchar(10)),6)
from #1
end
GO
exec p_BuildActiveNum 'c',89000(10000 row(s) affected)
id code
----------- -------------------
600 c724753089000
601 c724772089000
602 c724790089000
603 c724809089000
604 c724828089000
605 c724846089000
606 c724865089000
607 c724884089000
608 c724902089000
609 c724921089000
610 c724939089000
611 c724958089000
612 c724977089000
613 c724995089000
614 c725014089000
615 c725033089000
616 c725051089000
617 c725070089000
618 c725089089000
619 c725107089000
620 c725126089000
621 c725144089000
622 c725163089000