2016-09-20 1 views
0

SQL Server 테이블에 특정 수의 행을 삽입해야합니다.숫자 범위를 기반으로 테이블에 여러 행을 삽입하는 방법

DECLARE @val AS INT = 20, 
     @val2 AS VARCHAR(50), 
     @Date AS DATETIME = CONVERT(DATETIME,'02-05-2016'), 
     @i AS INT = 0 

SET @val2 = 'abc' 

DECLARE @tbl TABLE 
(
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [val2] VARCHAR(50) NULL, 
    [datum] [datetime] NULL 
) 

--INSERT INTO @tbl 
SELECT @val2, DATEADD(DAY, @i, @Date) 
UNION ALL 
SELECT @val2, DATEADD(DAY, @i, @Date) 

이 쿼리에서 주어진 날짜부터 시작하여 변수 '@val'에 지정된 값의 수까지 날짜를 삽입해야합니다. 따라서이 경우 '02 -05-2016 '부터 20 개의 행을 표에 삽입 한 다음 각 행에 대해 1 일 증가하는 날짜가 필요합니다.

루프 나 여러 삽입 문없이 단일 명령문에서 어떻게 수행 할 수 있습니까?

+0

분명히 당신이 실행중인 숫자/날짜의 목록을 만들려고합니다 : [내 답변 중 하나 (http://stackoverflow.com/a/32474751/5089204))를 사용하여 'Tally-CTE' 숫자, 날짜 및 매일 많은 부수 정보 목록을 만들 수 있습니다. 이것이 당신이 필요로하는 것이라고 생각하십시오 ... – Shnugo

답변

1

숫자 표가있는 경우 숫자 표를 사용할 수 있으며 2048까지의 값이있는 표를 원하면 master.dbo.spt_values을 사용하거나 직접 표를 만들 수 있습니다. 이 경우 master.dbo.spt_values을 사용할 수

DECLARE @val AS INT=20, @val2 AS VARCHAR(50); 
DECLARE @Date AS DATETIME = CONVERT(DATETIME,'02-05-2016'); 

SET @val2 = 'abc' 

INSERT INTO dbo.YourTable 
SELECT @val2, DATEADD(DAY,number,@Date) 
FROM master.dbo.spt_values 
WHERE type = 'P' 
AND number <= @val; 

이 0에서 시작하기 때문에, 당신은 결과 내 의견에서 지적 자세한 대답 게다가

+0

이것은 가장 빠르고 가장 실현 가능한 해결책입니다. –

0

로 21 개 행을 얻을 것이다 있지만, 이것은이있다 짧은 아이디어 :

DECLARE @start INT=0; 
DECLARE @end INT=19; --0 to 19 are 20 days 

DECLARE @StartDate DATE={d'2016-01-01'}; 

--Create a List of up to 1.000.000.000 rows on the fly 
--This is limited by start and end parameter 

;WITH x AS(SELECT 1 AS N FROM(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) AS tbl(N))--10^1 
,N3 AS (SELECT 1 AS N FROM x CROSS JOIN x AS N2 CROSS JOIN x N3) --10^3 
,Tally AS(SELECT TOP(@[email protected] +1) ROW_NUMBER() OVER(ORDER BY(SELECT NULL)) + @start -1 AS Nr FROM N3 
      CROSS JOIN N3 N6 CROSS JOIN N3 AS N9) 

--INSERT INTO your_table 

SELECT @val2 --your @val2 here as a constant value 
     ,DATEADD(DAY,Nr,@StartDate) 
FROM Tally 
0

recursive CTE을 사용할 수 있습니다.

DECLARE @i INT = 1 
    , @m INT = 19 
    , @d DATETIME2 = '2016-05-02'; 

WITH i AS (
    SELECT 0 AS increment 
    UNION ALL 
    SELECT i.increment + @i 
    FROM i 
    WHERE i.increment < @m 
) 
SELECT i.increment 
    , DATEADD(DAY, i.increment, @d) 
FROM i 
OPTION (MAXRECURSION 100); 

주 꼭 필요하지만 어떻게 작동하는지 설명하기 위해 그것을 포함하지입니다 하단의 OPTION (MAXRECUSION 100) 힌트. 기본적으로이 방법을 사용하면 결과가 100 개로 제한되므로이 문을 사용하지 않고 @m이 큰 숫자 인 경우 1000 그러면 SQL이 오류를 생성합니다. 당신은 무한 루프를 막을 수 있기 때문에 무한대를 의미하는 0으로 설정할 수 있습니다. (이는 기본적으로 제한이 존재하는 이유입니다).

+0

이 방식은 현대적인 방식으로 설정되어 있으며, 'CROSS JOIN'방식보다 3-5 배 정도 느립니다. 재귀 CTE는 숨겨진 RBAR입니다. 그들은 나무 아래에서 피들을 치는 것이 좋지만 달리기 목록을 만드는 가장 좋은 도구는 아닙니다. ... – Shnugo

+0

@Shnugo 거기에 당신은 불필요한 형용사를 제거했습니다. – knuckles

관련 문제