2016-07-24 38 views
1

我想知道如何創建一個增量表,以便在執行過程時,該表中包含相同的行數與用於執行該過程的參數的創建增量表。如何在執行

例如,如果我執行此:

EXEC PROCEDURE [dbo].[insert_number] 5 

我應該有一個表(姑且稱之爲表「數字」)顯示以下內容:

NumberID 
1 
2 
3 
4 
5 

如果我更改號碼在EXEC以下:

EXEC PROCEDURE [dbo].[insert_number] 7 

它應該輸出:

NumberID 
    1 
    2 
    3 
    4 
    5 
    6 
    7 

我不想使用sys.objects中的方法,需要使用主分貝。

什麼是執行這種類型的插入的最佳方式?

謝謝

回答

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 

您還可以創建表只有一次,註釋掉表創建腳本

+0

什麼master..spt_values?這是否也需要進入主數據庫? –

+0

它的一個時間表創建腳本,也有很多的方式來創建一個數字表,一個我張貼只是一個 – TheGameiswar

+0

是否有一種方法可以說我張貼部署腳本和執行過程,儀器會時無論是價值就像那樣創建理貨/號碼錶?只是在想的替代方法之一的您提供我已經更新了一個例子,其在犯規數據庫兌現使用遞歸CTE –

0

如果您沒有(或需要)數字/統計表,我使用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 
+0

嗨,約翰,我更喜歡一個理貨表,但對於那些更喜歡使用UDF方法 –

+0

夠好的人來說,這是一個很好的答案。當你需要可變範圍和增量時,只需保留在後袋中,即+12或+0.75。乾杯 –

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