例如生成结果为 AQ7F88G7

解决方案 »

  1.   

    declare @s varchar(10)
    set @s=''while len(@s)<8
    select @s=@s+a
    from (
    select 'A' as a
    union all
    select 'B' as a
    union all
    select 'C' as a
    union all
    ...
    select 'N' as a
    union all
    select 'P' as a
    union all
    ...
    select 'Z' as a
    union all
    select '1' as a
    union all
    select '2' as a
    union all
    ...
    select '9' as a
    ) as t
    order by newid()print @s
      

  2.   

    这么费劲?
    不能根据select (left(newid(),8)),然后从中排除包含"0"和"o"的吗?
      

  3.   

    DECLARE @s CHAR(8)
    WHILE @s IS NULL OR CHARINDEX('0',@s)>0 OR CHARINDEX('o',@s)>0
    SELECT @s= RTRIM(LEFT(newid(),8))
    SELECT @s
      

  4.   

    楼上两位
    直接用newid()不对,因为newid()的格式是
    xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字
    少了g-z
      

  5.   

    fcuandy(要学的东西还很多)
    的方法也可以,比较简单
      

  6.   

    lz:
    直接用newid()的达不到要求,上面说了结贴后回复只是希望lz能得到正确的答案
      

  7.   

    Haiwer(海阔天空) ( ) 信誉:138  2006-06-30 10:36:00  得分: 0  
     
     
       楼上两位
    直接用newid()不对,因为newid()的格式是
    xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字
    少了g-z
    ----------------------------说的也是。 不过要看楼主要求了。
    对于newid()的前8位,是{1-9,a-z}组成8位字串的所有组合 的子集, 如果楼主要求取一个字串,而不是列出所有,我觉得这没什么问题。
    如果要求这字串里必须出现 g-z中的一个,那就要改了.你的那种思路,看到楼主的要求时,我就试过
    我用了一个表变量,插入1-9,a-z(除o) 34条记录,然后 join, 再TOP 1 ,ORDER BY NEWID(),根本无法运行。
    这比自己用程序(如c/c++)算出所有组合还慢。
    而且你的写法有问题: 在循环中用了递规查询变量,递规查询变量本身就可以..,再套用循环肯定是错的。