Sql 使用crypt_gen_random生成唯一序列号

Sql 使用crypt_gen_random生成唯一序列号,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,正在尝试生成具有字母数字(A-Z、A-Z、0-9)且无特殊字符的唯一序列号。用于以下代码,其中长度最小为10,最大为12,如前端所定义 declare @sLength tinyint declare @randomString varchar(50) declare @counter tinyint declare @nextChar char(1) declare @rnd as float set @sLength = 3 set @counter = 1 set @randomStri

正在尝试生成具有字母数字(A-Z、A-Z、0-9)且无特殊字符的唯一序列号。用于以下代码,其中长度最小为10,最大为12,如前端所定义

declare @sLength tinyint
declare @randomString varchar(50)
declare @counter tinyint
declare @nextChar char(1)
declare @rnd as float

set @sLength = 3
set @counter = 1
set @randomString = ''

while @counter <= @sLength
begin
    -- crypt_gen_random produces a random number. We need a random    
    -- float.
    select @rnd = cast(cast(cast(crypt_gen_random(2) AS int) AS float) /    
         65535  as float)  
    select @nextChar = char(48 + convert(int, (122-48+1) * @rnd))
    if ascii(@nextChar) not in (58,59,60,61,62,63,64,91,92,93,94,95,96)
    begin
        select @randomString = @randomString + @nextChar
        set @counter = @counter + 1
    end
 end
 select @randomString
declare@sLength tinyint
声明@randomString varchar(50)
声明@counter tinyint
声明@nextChar字符(1)
将@rnd声明为float
设置为@sLength=3
设置@counter=1
设置@randomString=''

而@counter我修改了代码以插入唯一的序列号,如下所示

declare @i int = 4000
while @i>0  
begin
declare @sLength tinyint
declare @randomString varchar(50)
declare @counter tinyint
declare @nextChar char(1)
declare @rnd as float
declare @ExcludeNumbers varchar(50)
DECLARE @XML XML
set @ExcludeNumbers='A,B,C,D,E,F,G,H,1,2,3'
SET @XML = CAST('<i>' + REPLACE(@ExcludeNumbers, ',', '</i><i>') + '</i>' AS XML)

set @sLength = 10
set @counter = 1
set @randomString = ''

while @counter <= @sLength
begin
    -- crypt_gen_random produces a random number. We need a random
        -- float.
    select @rnd = cast(cast(cast(crypt_gen_random(2) AS int) AS float) /    
         65535  as float)  
    select @nextChar = char(48 + convert(int, (122-48+1) * @rnd))
    if ascii(@nextChar)   in (select ASCII((x.i.value('.', 'VARCHAR(MAX)'))) FROM  @XML.nodes('i') x(i))
    begin
        select @randomString = @randomString + @nextChar
        set @counter = @counter + 1
    end
 end
 insert into serialNo values( @randomString);   
 select @i = @i-1 
 End
声明@i int=4000
而@i>0
开始
声明@sLength tinyint
声明@randomString varchar(50)
声明@counter tinyint
声明@nextChar字符(1)
将@rnd声明为float
声明@ExcludeNumbers varchar(50)
声明@XML
集合@ExcludeNumber='A、B、C、D、E、F、G、H、1、2、3'
将@XML=CAST(“”+REPLACE(@ExcludeNumbers,“,”)+“”设置为XML)
设置为@sLength=10
设置@counter=1
设置@randomString=''

而@计数器则考虑在客户端执行此操作。T-SQL只是一种非常糟糕的语言,不能用它来做这类事情。另外,还不清楚为什么您同时需要
@Include
@Exclude
——只提供
@Include
,难道还不够吗?如果意图是
@Include
包含某种程度上必须的字符,则需要更精确的规范(而T-SQL对这种逻辑的吸引力甚至更低)。