要求:存储实现(开始序列,结束序列以参数格式传入)
格式:a+00000+00000
效果:a273837982736
位数:必需为13位.
备注:前6位取值范围在:1~1000000,后6位相同。
请您写出具体的执行时间,主要看下性能!

解决方案 »

  1.   

    --取得随机数的视图
    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
    --*/
      

  2.   

    select 'a' + right('000000' + cast(cast(rand(checksum(newid()))*100000 as int) as varchar),6) + '000000' from sysobjects/*
                        
    ------------------- 
    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 行)*/
      

  3.   

    --格式:a+00000+00000 
    select 'a'+right(1000000+checksum(newid())%1000000,6)
    +right(1000000+checksum(newid())%1000000,6)
    /*
    -------------------------
    a973577475675(1 行受影响)
    */
      

  4.   

    select 'A'+right(checksum(newid()),6)+right(checksum(newid()),6)
    /*
                              
    ------------------------- 
    A297764439466(所影响的行数为 1 行)
    */
      

  5.   

    IF OBJECT_ID('PROC_DATA')IS NOT NULL DROP PROC PROC_DATA
    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 個資料列)*/
      

  6.   

    8楼的哥们符合我的意图。
    是以sp方式生成。
    不过,结果不是我要的。
    ---------------
    格式:a+00000+00000  -->如:a 8484743 373784 (从几开始到哪结束,取其间的随机数组合成6位码)
    效果:a273837982736 
    位数:必需为13位. 
    请您写出具体的执行时间,主要看下性能!
    --------------------
      

  7.   

    格式:a+00000+00000  -->如:a 8484743 373784 (从几开始到哪结束,取其间的随机数组合成6位码) 
    沒太理解8484743 是隨機生成的?
    373784是固定的?
      

  8.   

    IF OBJECT_ID('PROC_DATA')IS NOT NULL DROP PROC PROC_DATA
    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 個資料列)*/
      

  9.   

    我贴出自己的代码,请各位检查下性能方面如何?
    有没有更好的解决方案:--输入参数:@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
      

  10.   


    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