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

标签 sql sql-server tsql

我有以下 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;

这很好用,除了每个字符串都作为一个独立的结果集返回。

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

环境是 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

关于sql - 在 SQL Server 中将 while 循环值作为多行而不是多个结果集返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39087442/

相关文章:

sql - 使用 postgresql 计算跳出次数

sql - 比SOUNDEX更好的东西

c# - 在 C# 中将 ODBC MySQL 字符串替换为 SQL Server 字符串

asp.net - Azure API应用程序与移动应用程序与Web应用程序

sql-server - TSQL for xml 将架构属性添加到根节点

tsql - 从大表中使用 LIKE 选择时,SQL Server 2012 性能不佳

MYSQL 在字符串中查找 INT

sql - 我可以在同一个表中有 2 个唯一列吗?

sql-server - 按值分组并从 T-SQL 中的每个组的点(纬度和经度)创建地理折线

sql - 在 sql case 语句中使用比较符号