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)时,只需将其放在后口袋中即可。干杯