[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.그것은 일반적으로 루프를 사용하는 것은 좋은 생각 - 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.다음은 테이블 변수와 옵션은 다음과 같습니다
다음은 테이블 변수와 옵션은 다음과 같습니다
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.이 같은 변수 테이블을 사용할 수 있습니다 :
이 같은 변수 테이블을 사용할 수 있습니다 :
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.이런 종류의 당신이 결과를 수행 할 작업에 따라 달라집니다. 모든 일에 대한 편리 - 당신은 단지 숫자 이후 인 경우에, 세트 기반의 옵션은 숫자 테이블이 될 것입니다.
이런 종류의 당신이 결과를 수행 할 작업에 따라 달라집니다. 모든 일에 대한 편리 - 당신은 단지 숫자 이후 인 경우에, 세트 기반의 옵션은 숫자 테이블이 될 것입니다.
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.
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.물론 오래된 질문 꺼짐. 하지만 간단한 솔루션이 곳 등 루핑, 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.
[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]
from https://stackoverflow.com/questions/10300414/sql-server-for-each-loop by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 9000 만 개 기록을 처리 SQLite는 할 수 있습니까? (0) | 2020.06.22 |
---|---|
[SQL] 비트 중 하나가 일치하는 경우 SQL에 두 개의 비트 마스크를 비교하는 것은 볼 수 (0) | 2020.06.22 |
[SQL] (다른 테이블이다)의 다른 컬럼에 하나 개의 컬럼 데이터를 복사 (0) | 2020.06.22 |
[SQL] 하루 그룹에 SQL 쿼리 (0) | 2020.06.22 |
[SQL] 정렬 평균은 무엇입니까? (0) | 2020.06.22 |