【发布时间】:2021-04-17 03:18:57
【问题描述】:
【问题讨论】:
-
为什么要使用 any 循环? SQL 不需要循环。只要您还没有 Numbers 表,您所需要的只是一种生成从 1 到 20 的序列的方法
-
您可能正在寻找
REPLICATE函数 -
您为什么要这样做?对我来说听起来像是某种学校作业..
标签: sql-server
【问题讨论】:
REPLICATE 函数
标签: sql-server
在 WHILE 中使用 REPLICATE。我想,如果你做对了,你可以达到你想要的输出吗?
DECLARE @i INT = 20
WHILE(@i>0)
BEGIN
PRINT REPLICATE('* ', @i);
SET @i = @i - 1;
END
【讨论】:
您可以使用REPLICATE 将一个字符重复一定次数。要生成从 1 到 20 的数字序列,无论如何您都不需要 WHILE - SQL 并不真的需要 WHILE 语句来处理数据。
数字序列总是有用的,这就是为什么几乎每个 SQL 开发人员都会创建 Numbers table。
如果您还没有,生成 20 个数字的一种快速而肮脏的方法是从系统表中选择前 20 行,并使用ROW_NUMBER 计算行数,例如:
select top 20 replicate('*',21-row_number() over (order by id) )
from sys.sysobjects
使用 Numbers 表,查询更简单:
select replicate('*',Number )
from dbo.Numbers
where Numbers.Number <= 20
order by Number desc
数字表非常有用,例如对于从 2017/1/1 开始的 200 天这样的元素集:
select dateadd(d,Number,cast('20170101' as date))
from dbo.Numbers
where Numbers.n<= 20
order by Number desc
【讨论】:
试试这个,
DECLARE @StrLen INT = 20
WHILE @StrLen >= 1
BEGIN
PRINT REPLICATE('*',@StrLen)
SET @StrLen = @StrLen - 1
END
【讨论】:
没有 replicate() 解决方案
BEGIN
DECLARE @i int = 20
DECLARE @j int
DECLARE @line varchar(max)
WHILE @i > 0
BEGIN
SET @line = ''
SET @j = 0
WHILE @j < @i
BEGIN
SET @line += '* '
SET @j = @j + 1
END
PRINT @line
SET @i = @i - 1
END
END
【讨论】:
使用递归 CTE(按 Ctrl+T 获取文本结果)
;WITH A AS (
SELECT REPLICATE('* ', 20) X
UNION ALL
SELECT LEFT(X, LEN(X) - 2)
FROM A
WHERE X > '* '
)
SELECT * FROM A
另一种方式:
;WITH A AS (
SELECT 20 X
UNION ALL
SELECT X - 1 FROM A
WHERE X > 1
)
SELECT REPLICATE('* ', X) FROM A
【讨论】:
试试下面的代码:
Declare @i int,@a int
Set @a = 7
Set @i = -@a;
While (@i<10)
Begin
Set @i = @i + 1
Print replicate('* ',@a - abs(@i))
End
你可以看到更多不同的三角形examples in here
【讨论】: