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.
谢谢!
做这种事情的最好方法是忘记在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)