SQL Server:具有通过重复A-Z组织的100行的列



我希望创建一个有100行的表,第一列由字母a-Z组织,并一直重复到100。我最接近的是:

  1. 有一个数字列,然后使用ASCII值将数字转换为字母,但这需要先创建数字列,再使字母列依赖于此列或

  2. 我已经能够创建一列,但当我尝试打印整个表时,它显示为AAAA、BBBB、CCCC、DDDD等。

我需要列完全独立,这就是为什么解决方案#1不起作用,而且我找不到一种方法来正确排序或组织解决方案#2,使其成为a、B、C,而不是现在的打印方式。上下文屏幕截图:

解决方案1

解决方案2

我一直在使用这个代码来创建表:

SELECT n
FROM (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) t(n)
)
SELECT n1.n + n10.n * 10 as col
INTO dbo.table1
FROM nums n1
CROSS JOIN nums n10;

然后对于解决方案1,我尝试了这个:

ALTER TABLE numbers
ADD letters AS CHAR(num % 26 + 65);
SELECT * FROM numbers
ORDER BY num;

对于解决方案2,这是:

ALTER TABLE table1
ALTER COLUMN col VARCHAR(3);
UPDATE table1
SET col = col % 26 + 65;
UPDATE table1
SET col = CHAR(col);
SELECT * FROM table1
ORDER BY col;

我已经研究了几个小时,在两种解决方案中尝试了不同的方法来获得答案。

提前谢谢。

如果您想重复循环生成字母,可以使用递归CTE:

with cte as (
select convert(varchar(max), 'A') as letter, 1 as n
union all
select (case when letter < 'Z' then convert(varchar(max), char(ascii(letter) + 1)) else 'A' end),
n + 1
from cte
where n < 100
)
select letter
from cte;

可以使用insertselect into将值放入表中。

如果想要超过100行,则需要添加option (maxrecursion 0)

表中没有特定的行顺序。即使表指定了聚集索引。这样的概念在关系数据库中并不存在。为了确保值的特定顺序,您需要在SELECT语句中使用ORDERBY子句强制执行。考虑到这一点,以下代码必须让您了解如何实现您的解决方案:

With nums as (
SELECT n
FROM (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) t(n)
),
numbers as (
SELECT n1.n + n10.n * 10 as num
FROM nums n1
CROSS JOIN nums n10
)
select num, char(num/26 + 65) + CHAR(num % 26 + 65)
from numbers
order by num

最新更新