Sql 如何在执行时创建增量表

Sql 如何在执行时创建增量表,sql,sql-server,Sql,Sql Server,我想知道如何创建一个增量表,以便在执行过程时,该表包含与用于执行过程的参数相同的行数 例如,如果我执行此操作: 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

我想知道如何创建一个增量表,以便在执行过程时,该表包含与用于执行过程的参数相同的行数

例如,如果我执行此操作:

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方法,因为这需要使用master db

执行这种插入的最佳方式是什么


谢谢

误解了这个问题,所以问题是表应该根据参数自动递增

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

您也可以只创建一次表,并注释掉表创建脚本对问题的误解,因此问题是表应根据参数自动递增

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

您也可以只创建一次表并注释掉表创建脚本

如果您没有或想要数字/理货表,我将使用自定义项创建动态范围

Select NumberID=cast(RetVal as int) from [dbo].[udf-Create-Range-Number](1,10,1)
返回

NumberID
1
2
3
4
5
6
7
8
9
10
UDF

CREATE FUNCTION [dbo].[udf-Create-Range-Number] (@R1 money,@R2 money,@Incr money)

-- Syntax Select * from [dbo].[udf-Create-Range-Number](0,100,2)

Returns 
@ReturnVal Table (RetVal money)

As
Begin
    With NumbTable as (
        Select NumbFrom = @R1
        union all
        Select nf.NumbFrom + @Incr
        From NumbTable nf
        Where nf.NumbFrom < @R2
    )
    Insert into @ReturnVal(RetVal)

    Select NumbFrom from NumbTable Option (maxrecursion 0)

    Return
End

如果您没有或想要数字/理货表,我将使用UDF创建动态范围

Select NumberID=cast(RetVal as int) from [dbo].[udf-Create-Range-Number](1,10,1)
返回

NumberID
1
2
3
4
5
6
7
8
9
10
UDF

CREATE FUNCTION [dbo].[udf-Create-Range-Number] (@R1 money,@R2 money,@Incr money)

-- Syntax Select * from [dbo].[udf-Create-Range-Number](0,100,2)

Returns 
@ReturnVal Table (RetVal money)

As
Begin
    With NumbTable as (
        Select NumbFrom = @R1
        union all
        Select nf.NumbFrom + @Incr
        From NumbTable nf
        Where nf.NumbFrom < @R2
    )
    Insert into @ReturnVal(RetVal)

    Select NumbFrom from NumbTable Option (maxrecursion 0)

    Return
End

另一个更简单的方法是

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

另一个更简单的方法是

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

什么是master..spt_值?这也需要进入主数据库吗?这是一个一次性的表格创建脚本,有很多方法可以创建数字表格,我发布的只是一个。有没有一个方法可以让我们假设我发布部署一个脚本,无论执行过程时的值是什么,它都会像那样创建计数/数字表格?只是想到了一种替代方法,而不是您提供的各种答案我又更新了一个示例,它没有在数据库中使用递归CTE具体化。看看另一个示例,它会在表中插入数字,是吗?刚试过你答案中的第一个片段,我仍然得到一个空白的数字表。我尝试在方法中包含一个INSERT,但错误声明无法将解释值插入标识列,该列为'NumberID'What's master..spt_值?这也需要进入主数据库吗?这是一个一次性的表格创建脚本,有很多方法可以创建数字表格,我发布的只是一个。有没有一个方法可以让我们假设我发布部署一个脚本,无论执行过程时的值是什么,它都会像那样创建计数/数字表格?只是想到了一种替代方法,而不是您提供的各种答案我又更新了一个示例,它没有在数据库中使用递归CTE具体化。看看另一个示例,它会在表中插入数字,是吗?刚试过你答案中的第一个片段,我仍然得到一个空白的数字表。我尝试在方法中插入一个INSERT,但错误声明无法在标识列“NumberID”中插入明确的值。嗨,John,我确实更喜欢理货表,但对于那些更愿意公平使用UDF方法的人来说,这是一个很好的答案。当您需要可变范围和增量(即+12或+0.75)时,只需将其放在后口袋中即可。谢谢,约翰,我确实更喜欢理货台,但对于那些更喜欢使用UDF方法的人来说,这是一个很好的答案。当您需要可变范围和增量(即+12或+0.75)时,只需将其放在后口袋中即可。干杯