Sql 如何生成两级循环

Sql 如何生成两级循环,sql,sql-server,common-table-expression,Sql,Sql Server,Common Table Expression,如果我有两个变量 A=2 B=3 我想生成这样的结果 A | B | Text 1 | 1 | Text1 1 | 2 | Text2 1 | 3 | Text3 2 | 1 | Text4 2 | 2 | Text5 2 | 3 | Text6 我尝试谷歌,可以达到这个查询1级 declare @start int = 1 declare @end int = 3 ;with numcte AS

如果我有两个变量

A=2 B=3 我想生成这样的结果

A  |  B  |  Text

1  |  1  |  Text1
1  |  2  |  Text2
1  |  3  |  Text3
2  |  1  |  Text4
2  |  2  |  Text5
2  |  3  |  Text6
我尝试谷歌,可以达到这个查询1级

    declare @start int = 1
    declare @end  int = 3

    ;with numcte  
    AS  
    (  
      SELECT @start as [SEQUENCE]
      UNION all  
      SELECT [SEQUENCE] + 1
      FROM numcte WHERE [SEQUENCE] < @end 
    )      
    SELECT  [SEQUENCE], 'text' + CAST([SEQUENCE] as varchar) as [text] FROM numcte

如何实现两级循环?

使用数字表,通过搜索可以使用许多示例。产生一个非常简单的例子的一种方法是:

with cte as (
   select 1 as num 
   union all select num + 1 from cte where num < 3 )
select cte.num, cte2.num from cte  
cross join cte as cte2 
where cte.num in (1, 2)
order by cte.num, cte2.num
;

努力解决这个问题——它可能看起来令人望而生畏。开始从集合的角度思考

一个相当简单的方法是:

select a.a, b.b, concat('text', row_number() over (order by a, b))
from (values (1), (2)) a(a) cross join
     (values (1), (2), (3)) b(b);
或者,如果确实要声明变量:

declare @a int = 2;
declare @b int = 3;
with n as (
      select 1 as n union all
      select n + 1
      from n
      where n < @a or n < @b
    )
select na.n as a, nb.n as b, concat('text', row_number() over (order by na.n, nb.n))
from n na join
     n nb
     on na.n <= @a and nb.n <= @b;

是一个DBFIDLE。

对“文本”部分使用交叉连接和行号。尽管递归CTE并不是生成数字的最有效方法。