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
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
不能根据select (left(newid(),8)),然后从中排除包含"0"和"o"的吗?
WHILE @s IS NULL OR CHARINDEX('0',@s)>0 OR CHARINDEX('o',@s)>0
SELECT @s= RTRIM(LEFT(newid(),8))
SELECT @s
直接用newid()不对,因为newid()的格式是
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字
少了g-z
的方法也可以,比较简单
直接用newid()的达不到要求,上面说了结贴后回复只是希望lz能得到正确的答案
楼上两位
直接用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++)算出所有组合还慢。
而且你的写法有问题: 在循环中用了递规查询变量,递规查询变量本身就可以..,再套用循环肯定是错的。