2016-07-21 7 views
0

からテーブルにデータを挿入する私は、このスクリプトを実行しようとしています:は、動的SQLスクリプト

DECLARE @Client VARCHAR(50) 
DECLARE @SQL VARCHAR(MAX) 
DECLARE @DBReporting VARCHAR(500) 
DECLARE @DBSignet VARCHAR(500) 
DECLARE @databasename varchar(100) 

    SET @SQL = '' 

    DECLARE db_cursor CURSOR FOR 
    SELECT name 
    FROM sys.databases 
    WHERE name like '%reporting%' 
      AND NOT Name Like '%UAT%' 
      AND NOT Name Like '%Test%' 
      AND NOT Name Like '%Demo%' 
      AND NOT Name like '%staging%' 
      AND NOT Name like '%server%' 
      AND state_desc <> 'offline' 

    OPEN db_cursor 
    FETCH NEXT FROM db_cursor INTO @databasename 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 

     SET @Client = REPLACE(REPLACE(@databasename, 'SourcingPlatform_', ''), '_Reporting', '') 

     SET @DBSignet = 'SourcingPlatform_' + @Client + '_Signet_Tradeflow' 
     SET @DBReporting = 'SourcingPlatform_' + @Client + '_Reporting' 

     SET @SQL = @SQL + 'INSERT INTO STS_Branding.[dbo].[S2C_KeyStats] 
      ([Project] 
      ,[DataDate] 
      ,[EventTypeName] 
      ,[CountOfAllEvents] 
      ,[CreatedWithinLast3Months] 
      ,[CreatedWithinLast6Months] 
      ,[CreatedWithinLast12Months]) 
    VALUES 

     SELECT ''' + @Client + ''' AS Client, convert(date, getdate()), EventTypeName collate Latin1_General_CI_AS, 
     count(id) as CountOfAllEvents, 

     (select COUNT(e3.ID) 
     from ' + @DBReporting + '..REPORTS_Sourcing_Event E3 
     where DATEDIFF(month,CreateDate, GETDATE()) <= 3 
     and  E.EventTypeName = E3.EventTypeName) as CreatedLast3Months, 

     (select COUNT(e6.ID) 
     from ' + @DBReporting + '..REPORTS_Sourcing_Event E6 
     where DATEDIFF(month,CreateDate, GETDATE()) > 3 
     and  DATEDIFF(month,CreateDate, GETDATE()) <= 6 
     and  E.EventTypeName = E6.EventTypeName) as CreatedLast6Months, 

     (select COUNT(e12.ID) 
     from ' + @DBReporting + '..REPORTS_Sourcing_Event E12 
     where DATEDIFF(month,CreateDate, GETDATE()) > 6 
     and  DATEDIFF(month,CreateDate, GETDATE()) <= 12 
     and  E.EventTypeName = E12.EventTypeName) as CreatedLast12Months, 

     (select COUNT(e13.ID) 
     from ' + @DBReporting + '..REPORTS_Sourcing_Event E13 
     where DATEDIFF(month,CreateDate, GETDATE()) > 12 
     and  E.EventTypeName = E13.EventTypeName) as CreatedOver12Months 

     FROM ' + @DBReporting + '..REPORTS_Sourcing_Event E 

     Group By EventTypeName 

     UNION ' 

     FETCH NEXT FROM db_cursor INTO @databasename 
    END 

    CLOSE db_cursor 
    DEALLOCATE db_cursor 

SET @sql = substring(@sql, 0, LEN(@sql) - len('UNION ')) + ' ORDER BY Client, EventTypeName collate Latin1_General_CI_AS' 

--PRINT @SQL 
exec(@SQL) 

しかし、私は構文エラーを取得しています。

私は@SQL変数を出力しており、生成されたコードは良く見えます。私はここで本当に簡単なものを逃していますか?または私が達成したいものを私の方法でオフですか?

私が達成したいのは、最初の選択で参照された各DBを通過して値を取得し、それらをテーブルに挿入するスクリプトです。

私が助けてくれる情報がもう必要であれば教えてください。この時点で助けていただければ幸いです。

+0

エラーは何ですか?実行時に '@ SQL'の中にあるものは何ですか? –

+0

私が元々持っていたエラーは、値を入れてからselectを使っていたからです。私は値を削除し、私はハニーバジャーが私に指摘した問題に直面しました。私は今、単語の近くに間違った構文を取得しています。私は今これを反映するために私の質問を更新します。多くのありがとう、Dave – Dave

+0

これはどのRDBMSですか? 'mysql'、' postgresql'、 'sql-server'、' oracle'、 'db2'のどれかを指定するタグを追加してください。 –

答えて

0

あなたが生成されたクエリを投稿する必要がありますが、私はそれはのようになりますと思う:

INSERT INTO STS_Branding.[dbo].[S2C_KeyStats] 
      ([Project] 
      ,[DataDate] 
      ,[EventTypeName] 
      ,[CountOfAllEvents] 
      ,[CreatedWithinLast3Months] 
      ,[CreatedWithinLast6Months] 
      ,[CreatedWithinLast12Months]) 
VALUES -- Remove this, it's incorrect in combination with SELECT  
SELECT (lots of selects) 

UNION 

INSERT INTO STS_Branding.[dbo].[S2C_KeyStats] 
      ([Project] 
      ,[DataDate] 
      ,[EventTypeName] 
      ,[CountOfAllEvents] 
      ,[CreatedWithinLast3Months] 
      ,[CreatedWithinLast6Months] 
      ,[CreatedWithinLast12Months]) 

SELECT (lots of selects) 

これは明らかにできません、あなたはselectsないinsertunionたい。だから、insertステートメント(カーソルの外)で@SQLを開始することから始めるべきです。カーソル内では、SET @SQL = @SQL + ...を使用することができます。ただし、insert文は使用しないでください。

また、substringはではなく、C#のようにSQLに基づく1です。

+0

HoneyBadgerありがとうございます。これは私を助けました。私はこの後、構文エラーには関係しない別のエラーが出ます。最後の列とFROM句の間にカンマを置きました。この回答は私を助け、問題を解決しました。 – Dave

+0

@Dave編集:私が 'VALUES'を削除しましたので、' select'で 'insert'で使うのは間違いです。私はそれがあなたの誤りだと思う。 – HoneyBadger

+0

はい私はそれを入れていたとすぐに私はこれを削除していた。あなたの助けをたくさんありがとう。非常に感謝しています。 – Dave