将while循环值作为SQL Server中的多行返回,而不是多个结果集

Sim*_*rdo 2 sql t-sql sql-server

我有以下T-SQL,用于生成一些随机值:

DECLARE @cnt INT = 0;

WHILE @cnt < 100
BEGIN

select
    Random_String =
    substring(x,(abs(checksum(newid()))%36)+1,1)+       
    substring(x,(abs(checksum(newid()))%36)+1,1)+
    substring(x,(abs(checksum(newid()))%36)+1,1)

from
          (select x='0123456789ABCDEFGHJKLMNPQRSTUWXYZ%#-=+') a

          SET @cnt = @cnt + 1;
END;
Run Code Online (Sandbox Code Playgroud)

这很好用,除了每个字符串返回,看起来像一个独立的结果集.

有没有办法重构该查询以将每个值作为同一结果集中的一行返回?

环境是MS SQL Server 2008.

谢谢!

Sea*_*nge 7

做这种事情的最好方法是忘记在t-sql中循环.使用数字或计数表是一个更好的方法来解决这个问题.

WITH
    E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
    E2(N) AS (SELECT 1 FROM E1 a cross join E1 b), --10E+2 or 100 rows
    cteTally(N) AS 
    (
        SELECT  ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E2
    )

select
    Random_String =
    substring(x,(abs(checksum(newid()))%36)+1,1)+       
    substring(x,(abs(checksum(newid()))%36)+1,1)+
    substring(x,(abs(checksum(newid()))%36)+1,1)

from
(select x='0123456789ABCDEFGHJKLMNPQRSTUWXYZ%#-=+') a
cross join cteTally t
where t.N < = 100
Run Code Online (Sandbox Code Playgroud)