2016-07-21 31 views
0

Ich versuche, dieses Skript auszuführen:Einfügen von Daten in eine Tabelle aus einem dynamischen SQL-Skript

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) 

Ich bin jedoch einen Syntaxfehler zu bekommen.

Ich habe die Variable @SQL ausgedruckt und der generierte Code sieht gut aus. Fehle ich hier etwas wirklich Einfaches? oder bin ich weit weg von dem, was ich erreichen möchte?

Was ich erreichen möchte, ist ein Skript, das durch jeden DB geht, auf den in der ersten Auswahl verwiesen wird und die Werte erhält und sie in meine Tabelle einfügt.

Lassen Sie mich wissen, wenn Sie weitere Informationen benötigen, um mir zu helfen, würde jede Hilfe an dieser Stelle sehr geschätzt werden.

+0

Was ist der Fehler? Was ist im '@ SQL' zum Zeitpunkt der Ausführung? –

+0

Der Fehler, den ich ursprünglich hatte, war, weil ich Werte gesetzt hatte und dann direkt danach wählte. Ich entfernte die Werte und ich wurde dann mit dem Thema konfrontiert, auf das Honigdachs mich hinwies. Ich bekomme jetzt eine falsche Syntax in der Nähe des Wortes von. Ich werde meine Frage aktualisieren, um dies jetzt zu reflektieren. Vielen Dank, Dave – Dave

+0

Für welches RDBMS ist das gedacht? Bitte fügen Sie ein Tag hinzu, um anzugeben, ob Sie 'mysql',' postgresql', 'sql-server',' oracle' oder 'db2' verwenden - oder etwas ganz anderes. –

Antwort

0

Sie sollten die generierte Abfrage schreiben, aber ich denke, es ist etwas wie folgt aussieht:

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) 

Dies ist natürlich nicht möglich, Sie wollen union die selects nicht die insert. Sie sollten also mit der Anweisung @SQL mit der Anweisung insert beginnen (außerhalb des Cursors). Innerhalb des Cursors können Sie SET @SQL = @SQL + ... verwenden, wie Sie bereits tun, aber ohne die insert Anweisung.

Bitte beachten Sie auch substring ist 1 basiert in SQL, nicht 0 wie in zum Beispiel C#.

+0

Danke HoneyBadger. Das hat mir sehr geholfen. Ich habe danach einen weiteren Fehler bekommen, was einen Syntaxfehler betrifft. Ich habe ein Komma zwischen der letzten Spalte und der FROM-Klausel hinterlassen. Diese Antwort hat mir geholfen und das Problem dankend gelöst. – Dave

+0

@Dave, siehe edit: Ich habe 'VALUES' entfernt, es ist falsch in' insert' mit 'select' zu verwenden. Ich denke, das war dein Fehler. – HoneyBadger

+0

Ja, ich hatte es entfernt, sobald ich es gesehen hatte, wenn ich es eingefügt hätte. Vielen Dank für Ihre Hilfe. Sehr geschätzt. – Dave