我想知道如何创建增量表,以便在执行过程时,该表包含与用于执行过程的参数相同的行数。
例如,如果我执行此操作:
EXEC PROCEDURE [dbo].[insert_number] 5
我应该有一张桌子(让我们调用表格' Number')显示以下内容:
NumberID
1
2
3
4
5
如果我将EXEC中的数字更改为:
EXEC PROCEDURE [dbo].[insert_number] 7
应输出:
NumberID
1
2
3
4
5
6
7
我不想使用sys.objects方法,因为这需要使用主数据库。
执行此类插入的最佳方法是什么?
谢谢
答案 0 :(得分:0)
误解了这个问题,所以问题是表格应该根据参数自动增加..
create proc usp_test1
(
@n int
)
as
begin
if object_id('number','u') is not null
drop table number
create table dbo.number
(
id int
);
with cte
as
(
select 1 as n
union all
select n+1 from cte
where n<@n
)
insert into number
select * from cte c where not exists(select 1 from number n where n.id=c.n)
end
您也可以只创建一次表并注释掉表创建脚本
答案 1 :(得分:0)
如果您没有(或想要)数字/计数表,我使用UDF来创建动态范围。
$env:chocolateyProxyPassword
返回
Select NumberID=cast(RetVal as int) from [dbo].[udf-Create-Range-Number](1,10,1)
UDF
NumberID
1
2
3
4
5
6
7
8
9
10
答案 2 :(得分:0)
另一种更简单的方法是......
CREATE PROCEDURE [dbo].[insert_number]
@Number INT
AS
BEGIN
SET NOCOUNT ON;
SELECT TOP (@Number) Numbers
FROM
(
SELECT ones.n + 10*tens.n + 100*hundreds.n + 1000*thousands.n + 10000*Tenthousands.n Numbers
FROM (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) ones(n),
(VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) tens(n),
(VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) hundreds(n),
(VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) thousands(n),
(VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) Tenthousands(n)
) t
ORDER BY Numbers
END