2016-09-01 3 views
1
내가 좋아하는, 두 개의 중첩 동안 루프를 사용하여 n 개의 테이블을 생성 내 SQL 코드를 변경하려면

:중첩 된 while 루프는 SQL입니까?

DECLARE @count1 INT 
SET @count1 = 2012 
DECLARE @count2 INT 
SET @count2 = 1 
WHILE @count1 <= 2016 
BEGIN 
WHILE @count2 <= 12 
    create table LGDfigRecov as 
select ... 
from ... 
WHERE FD0.mo_id=count2 
    AND FD0.an_id= count1 
... 
SET @count2 += 1 
END 
SET @count1 += 1 
END 

어떻게 때마다 "LGDfigRecov +의 COUNT1 + COUNT2"와 같은 새로운 테이블의 이름을 변경할 수 있습니까? 즉, 나는 연말에 연월의 이름을 가진 테이블을 매번 새로 만들고 싶다는 뜻입니다.

+0

동적 SQL - 당신은 SQL에서 SQL 명령의 문자열을 구축하고 문자열을 실행하는 것을 의미한다. –

+0

count1, count2를 포함하는 열을 가진 * one * 테이블은 어떻습니까? –

+0

먼저 SQL SERVER는 다음과 같은 테이블을 만들 수 없습니다. create table LGDfigRecov as select ... 동적 쿼리가 필요합니다. –

답변

1

문을 작성하는 데 이와 같은 쿼리를 사용할 수 있습니다. 만약 그들이

WITH 
MonthNumbers AS (SELECT * FROM(VALUES('01'),('02'),('03'),('04'),('05'),('06'),('07'),('08'),('09'),('10'),('11'),('12')) AS x(MonthNr)) 
,YearNumbers AS (SELECT * FROM(VALUES('2012'),('2013'),('2014'),('2015'),('2016')) AS x(YearNr)) 
SELECT ROW_NUMBER() OVER(ORDER BY YearNr,MonthNr) AS SortInx 
     ,CONCAT('CREATE TABLE LGDfigRecov_',YearNr,'_',MonthNr,' AS ', CHAR(13) + CHAR(10)) + 
     CONCAT('SELECT ... FROM ... ', CHAR(13) + CHAR(10)) + 
     CONCAT('WHERE FD0.mo_id=',MonthNr,' AND FD0.an_id=',YearNr,';') AS Cmd 
FROM MonthNumbers 
CROSS JOIN YearNumbers 

난 항상 불필요한 루프와 절차 적 접근을 피하려고 ...

  • 것은 CURSOR
  • 열기를 (단지 새 쿼리 창에 출력을 복사) 유효한 구문을 확인 이 SELECT
  • 에서 변수 @Cmd
  • 사용로 현명한 행이 페치하기 위해 CURSOR를 사용하여
+0

불행히도 다음과 같은 오류가 발생합니다 : 오류 : 문이 유효하지 않거나 올바른 순서로 사용됩니다. – maniA

+0

전체 결과 집합을 새 쿼리 창으로 복사하고 구문 오류가 있는지 확인하십시오. 'SELECT ... FROM ... '을 적합한 컬럼과 테이블 이름으로 대체해야합니다 ...'CURSOR' Id를 구현할 때'PRINT @ Cmd'를 추가하고' EXEC (@Cmd)'. 이렇게하면 실행될 명령문을 다시 확인할 수 있습니다. – Shnugo

1

아래 코드는 목표를 달성하는 데 도움이됩니다.

DECLARE @count1 INT, @w_SQL nvarchar(4000); SET @count1 = 2012 DECLARE @count2 INT SET @count2 = 1 WHILE @count1 <= 2016 BEGIN WHILE @count2 <= 12 SET @w_SQL = 'create table LGDfigRecov' + CONVERT(nvarchar(10), @count1) + CONVERT(nvarchar(10), @count2) + 'as select ... from ... WHERE FD0.mo_id=count2 AND FD0.an_id= count1 ...'
EXEC sp_executesql @w_SQL SET @count2 += 1 END SET @count1 += 1

+0

아마 SAS에서 SQL을 사용하고 있기 때문에 작동하지 않을 것입니다. 그러나 고마워! – maniA

관련 문제