2016-09-01 7 views
1
私はのように、ネストされた2つのwhileループを使用して、n個のテーブルを生成し、私のSQLコードを変更したい

SQLのネストされたWhileループ?

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

    関連する問題