복붙노트

[SQL] 각 루프에 대한 SQL 서버

SQL

각 루프에 대한 SQL 서버

나는 다음과 같은 SQL 쿼리를 가지고 :

DECLARE @MyVar datetime = '1/1/2010'    
SELECT @MyVar

이는 자연스럽게 '2010년 1월 1일'반환합니다.

내가하고 싶은 것은 날짜의 목록을 가지고있다, 말 :

1/1/2010
2/1/2010
3/1/2010
4/1/2010
5/1/2010

그리고 나는 숫자를 통해 각각에 원하는 SQL 쿼리를 실행합니다.

(의사)와 같은 뭔가 :

List = 1/1/2010,2/1/2010,3/1/2010,4/1/2010,5/1/2010

For each x in List
do
  DECLARE @MyVar datetime = x

  SELECT @MyVar

그래서이 반환 : -

1/1/2010 2/1/2010 3/1/2010 4/1/2010 5/1/2010

나는 루프 조합의 각 반복 그래서 다음에, 나는 쿼리의 끝에서 노동 조합의 어떤 종류를 사용해야 할 수 있도록이 하나 개의 결과 집합이 아니라 여러 결과 집합으로 데이터를 반환하고자합니다.

편집하다

나는 내가 (이 날짜는 동적 예정) 내가 피하려고 공급을 할 수 있어야 날짜에 특정과 24 번, 때마다 실행해야하는 '날짜'매개 변수를 받아들이는 큰 쿼리가 나는 그것이 매우 시간이 소모 될 것이다 돌아와서 추가 열을 추가 할 필요가있는 것처럼 노조 체하는 사람이 그들에 합류 내 쿼리를 24 회 반복.

해결법

  1. ==============================

    1.그것은 일반적으로 루프를 사용하는 것은 좋은 생각 - SQL은 주로 세트 지향 언어입니다.

    그것은 일반적으로 루프를 사용하는 것은 좋은 생각 - SQL은 주로 세트 지향 언어입니다.

    이 경우, 유사한 결과는 재귀 CTE를 사용하여 얻을 수 있습니다 :

    with cte as
    (select 1 i union all
     select i+1 i from cte where i < 5)
    select dateadd(d, i-1, '2010-01-01') from cte
    
  2. ==============================

    2.다음은 테이블 변수와 옵션은 다음과 같습니다

    다음은 테이블 변수와 옵션은 다음과 같습니다

    DECLARE @MyVar TABLE(Val DATETIME)
    DECLARE @I INT, @StartDate DATETIME
    SET @I = 1
    SET @StartDate = '20100101'
    
    WHILE @I <= 5
    BEGIN
        INSERT INTO @MyVar(Val)
        VALUES(@StartDate)
    
        SET @StartDate = DATEADD(DAY,1,@StartDate)
        SET @I = @I + 1
    END
    SELECT *
    FROM @MyVar
    

    당신은 임시 테이블과 같은 작업을 수행 할 수 있습니다 :

    CREATE TABLE #MyVar(Val DATETIME)
    DECLARE @I INT, @StartDate DATETIME
    SET @I = 1
    SET @StartDate = '20100101'
    
    WHILE @I <= 5
    BEGIN
        INSERT INTO #MyVar(Val)
        VALUES(@StartDate)
    
        SET @StartDate = DATEADD(DAY,1,@StartDate)
        SET @I = @I + 1
    END
    SELECT *
    FROM #MyVar
    

    당신은 @JohnFx으로이 아마 다른 (더 효율적으로) 방법을 수행 할 수 말한대로, 당신의 주요 목표는 무엇인지 알려해야합니다.

  3. ==============================

    3.이 같은 변수 테이블을 사용할 수 있습니다 :

    이 같은 변수 테이블을 사용할 수 있습니다 :

    declare @num int
    
    set @num = 1
    
    declare @results table ( val int )
    
    while (@num < 6)
    begin
      insert into @results ( val ) values ( @num )
      set @num = @num + 1
    end
    
    select val from @results
    
  4. ==============================

    4.이런 종류의 당신이 결과를 수행 할 작업에 따라 달라집니다. 모든 일에 대한 편리 - 당신은 단지 숫자 이후 인 경우에, 세트 기반의 옵션은 숫자 테이블이 될 것입니다.

    이런 종류의 당신이 결과를 수행 할 작업에 따라 달라집니다. 모든 일에 대한 편리 - 당신은 단지 숫자 이후 인 경우에, 세트 기반의 옵션은 숫자 테이블이 될 것입니다.

    MSSQL 2005 +를 들어, 숫자 테이블 인라인을 생성하는 재귀 CTE를 사용할 수 있습니다 :

    ;WITH Numbers (N) AS (
        SELECT 1 UNION ALL
        SELECT 1 + N FROM Numbers WHERE N < 500 
    )
    SELECT N FROM Numbers
    OPTION (MAXRECURSION 500)
    
  5. ==============================

    5.

    declare @counter as int
    set @counter = 0
    declare @date as varchar(50)
    set @date = cast(1+@counter as varchar)+'/01/2013'
    while(@counter < 12)
    begin 
    select  cast(1+@counter as varchar)+'/01/2013' as date
    set @counter = @counter + 1
    end
    
  6. ==============================

    6.물론 오래된 질문 꺼짐. 하지만 간단한 솔루션이 곳 등 루핑, CTE, 테이블 변수의 필요 없다

    물론 오래된 질문 꺼짐. 하지만 간단한 솔루션이 곳 등 루핑, CTE, 테이블 변수의 필요 없다

    DECLARE @MyVar datetime = '1/1/2010'    
    SELECT @MyVar
    
    SELECT DATEADD (DD,NUMBER,@MyVar) 
    FROM master.dbo.spt_values 
    WHERE TYPE='P' AND NUMBER BETWEEN 0 AND 4 
    ORDER BY NUMBER
    

    참고 : spt_values는 Mircrosoft의 문서화되지 않은 테이블입니다. 그것은 모든 종류의 수 있습니다. 이 사전 정보없이 SQL 서버의 새 버전에서 제거 될 수있는이 문서화되어 있기 때문에 그 암시되지는 사용할 수 있습니다. 그러나 우리는 이상과 같은 몇 가지 시나리오의의 빠른 해결로 사용할 수 있습니다.

  7. ==============================

    7.

    [CREATE PROCEDURE [rat].[GetYear]
    
    AS
    BEGIN
    
    -- variable for storing start date
    Declare @StartYear as int
    -- Variable for the End date 
    Declare @EndYear as int 
    
    -- Setting the value in strat Date
    select @StartYear = Value from   rat.Configuration where Name = 'REPORT_START_YEAR'; 
    
    -- Setting the End date 
    select @EndYear = Value from   rat.Configuration where Name = 'REPORT_END_YEAR'; 
    
    
    -- Creating Tem table 
        with [Years] as
        (
            --Selecting the Year
            select @StartYear [Year] 
            --doing Union 
            union all
             -- doing the loop in Years table 
             select Year+1 Year from [Years] where Year < @EndYear
         )
        --Selecting the Year table 
    selec]
    
  8. from https://stackoverflow.com/questions/10300414/sql-server-for-each-loop by cc-by-sa and MIT license