这是我的问题:我在SQL Server 2012中有一个存储过程,应该执行以下操作。
我将传递一个输入参数@Range
,存储过程应该将值插入从0到@Range-1
的表中。
CREATE PROC MyExample
(@Range INT)
AS
BEGIN
// Suppose the value of @Range is 100
// So I should do INSERT into MyTable Values(0,1,2,3,4,5,6,......99)
END
知道如何实现这个目标吗?
答案 0 :(得分:2)
您可以使用 while循环,如下所示:
Declare @Index AS INT=0
WHILE @Index<@Range
BEGIN
INSERT into MyTable Values(@Index)
SET @Index=@Index+1
END
答案 1 :(得分:0)
我想你的老师可能会怀疑你在学习循环时使用cte的原因
CREATE PROC MyExample
(
@Range INT,
)
AS
BEGIN
;WITH numbers AS
(
SELECT 0 AS Value WHERE @Range >= 0 -- Validate the @Range value too, try 0 or negative values
UNION ALL SELECT Value + 1 FROM numbers WHERE Value + 1 < @Range
)
INSERT INTO MyTable
SELECT * FROM numbers
OPTION (MAXRECURSION 0)
END
答案 2 :(得分:0)
CREATE PROC MyExample
(
@Range INT,
)
AS
BEGIN
declare @RANGE_COUNT int
select @RANGE_COUNT =@Range
//Suppose the value of @Range is 100
while @RANGE_COUNT<>0
begin
//So I should do INSERT into MyTable Values(0,1,2,3,4,5,6,......99)
INSERT into MyTable Values(@Range)
set @RANGE_COUNT = RANGE_COUNT -1
end
END
答案 3 :(得分:0)
这是基于集合的方法:
CREATE PROC MyExample
(
@Range INT,
)
AS
BEGIN
INSERT INTO MyTable (Number)
SELECT TOP (@Range) ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) - 1
FROM sys.objects s1
CROSS JOIN sys.objects s2
END
(基于this SO post)
答案 4 :(得分:0)
使用计数表技术:
DECLARE @range INT = 100
SELECT TOP(@range) -1 + ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS rn
FROM
(VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) t1(n) CROSS JOIN --10
(VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) t2(n) CROSS JOIN --100
(VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) t3(n) --1000
--...continue to cover all possible @range values