2017-12-04 8 views
0

データサービスチームが各データセットを独自のテーブルにロードする毎月、私の組織は毎月さまざまなデータセットを受信します。つまり、47個のファイルが提出され、 。かなりのアプローチではありませんが、時間の経過とともに改善されます。提出の年月はテーブル名の一部です。すなわちCMorgNZ322_200701PLD ... ..NZ322_200701はテーブル名の可変部分である。 NZ322Xはデータの起源であり、2007年は2007年4月(会計年度ベース)テーブルリストからテーブルクエリをSELECTクエリに渡す

私は書き込みをしたいので、テーブル名を月単位で修正するためにSELECTクエリを編集するのは嫌です。 1つのSELECTクエリから2番目のSELECTクエリにテーブル名を渡すストアドプロシージャ

これはLOOPSを使用するための私の最初の挑戦なので、最良のアプローチと2番目のテーブルへのテーブル名の渡し方は不思議です事前に初期SELECTクエリ

DECLARE cur_filestoprocess 
DECLARE @vcYrMth VarChar(6) 
SET @vcYrMth = ‘200701’ 

SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE ‘CMOrg%’ + @vcYrMth + ‘PLD’; 

SELECT COLa, 
     COLb, 
     COLc, 
     COLd, 
     SUM(COLg) AS ‘Activity’, 
     SUM(COLk) AS ‘Costs’ 
INTO RegionABC200701Summary 
FROM tablename1 
GROUP BY COLa, 
     COLb, 
     COLc, 
     COLd 

からSELECTクエリ、あなたの助けに感謝... ..

+0

あなたの質問/問題は正確ですか? – GuidoG

+2

動的SQLを使用する必要があります。 –

答えて

0

これが最もエレガントではないかもしれませんが、あなたが

DECLARE @tableName NVARCHAR(MAX) 

DECLARE @vcYrMth VARCHAR(6) 
SET @vcYrMth = '200701' 

IF OBJECT_ID('tempdb.dbo.#tmp', 'U') IS NOT NULL 
    DROP TABLE #tmp; 

SELECT TABLE_NAME 
INTO #tmp 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE 'CMOrg%' + @vcYrMth + 'PLD' 

DECLARE @rowNum INT 
SET @rowNum = 0 

DECLARE @length INT 
SELECT @length = COUNT(*) FROM #tmp 

WHILE (@rowNum < @length) 
BEGIN 

    SELECT @tableName = TABLE_NAME 
    FROM #tmp 
    ORDER BY TABLE_NAME OFFSET @rowNum ROWS 
    FETCH NEXT 1 ROWS ONLY 

    SELECT @sql = 'SELECT COLa, 
       COLb, 
       COLc, 
       COLd, 
       SUM(COLg) AS ‘Activity’, 
       SUM(COLk) AS ‘Costs’ 
      INTO Region'[email protected]+'Summary 
      FROM tablename1 
      GROUP BY COLa, 
       COLb, 
       COLc, 
       COLd' 
    FROM #tmp 

    --PRINT (@sql) 
    EXEC (@sql) 

    SET @rowNum = @rowNum + 1 
END 

アイデアを得る必要があり、動的SQLを使用して編集は 上記のみのバージョンを使用している場合、このスニペットを使用し、上記のSQL 2012のために動作します

以下

SELECT @tableName = TABLE_NAME 
FROM #tmp 
ORDER BY TABLE_NAME OFFSET @rowNum ROWS 
FETCH NEXT 1 ROWS ONLY 

を交換してください

SELECT @tableName = TABLE_NAME 
FROM (
    SELECT TABLE_NAME, ROW_NUMBER() OVER (ORDER BY TABLE_NAME) AS RowNumber 
    FROM #tmp 
    ) a 
WHERE RowNumber = @rowNum 
+0

ああ。ブリリアント。私は今、どのように進む必要があるかを見ます。とても感謝しています – BrizzleBorn

関連する問題