2017-02-21 3 views
0

Ich möchte die folgende gespeicherte Prozedur zu allen vorhandenen Datenbanken hinzufügen, die die Tabelle schichten enthalten. Alle meine Ansätze sind gescheitert, deshalb suche ich hier Hilfe.Dynamische gespeicherte Prozedur für alle Datenbanken mit spezifischer Tabelle erstellen

Das ist mein Ansatz:

IF object_id('tempdb.dbo.#database') is not null 
    drop TABLE #database 
GO 

CREATE TABLE #database(id INT identity primary key, name sysname) 
GO 

SET NOCOUNT ON 

INSERT INTO #database(name) 
    SELECT name 
    FROM sys.databases 
    WHERE source_database_id is null 
    ORDER BY name 

SELECT * FROM #database 

DECLARE @id INT, @cnt INT, @sql NVARCHAR(MAX), @currentDb SYSNAME; 

SELECT @id = 1, @cnt = max(id) FROM #database 

WHILE @id <= @cnt 
BEGIN 
    BEGIN TRY 
     SELECT @currentDb = name 
     FROM #database 
     WHERE id = @id 

     IF OBJECT_ID(@currentDb+'.dbo.schichten') IS NOT NULL 
      CREATE PROCEDURE @currentDb.[dbo].[Ausw_Tabelle_Taxi_Pers_Jahr] 
       @ColumnName nvarchar(MAX), 
       @Selector nvarchar(MAX), 
       @Gesamtergebnis nvarchar(MAX) 
      AS 
      BEGIN 
       SET NOCOUNT ON; 

       DECLARE @sql1 AS NVARCHAR(MAX), 
         @ASSelector nvarchar(MAX), 
         @IFPers nvarchar(MAX); 

       IF @Selector = 'konz' 
       BEGIN 
        SET @ASSelector = 'Taxi' 
        SET @IFPers='' 
       END 
       ELSE 
       BEGIN 
        SET @ASSelector = 'Personal' 
        SET @IFPers = '[name] AS Name,' 
       END 

       SET @sql1 = N';WITH temp AS (SELECT * 
         FROM (
    SELECT 
      ISNULL((DATENAME(m,[datum])+ cast(datepart(yyyy,[datum]) as varchar(5))),0) AS MONTHYEAR, 
      ISNULL(['+ @Selector +'],0) AS '+ @ASSelector +','+ @IFPers +'    
      ISNULL((ISNULL([umsum],0) + 
          ISNULL([sonst_0],0) + 
          ISNULL([sonst_7],0) + 
          ISNULL([sonst_16],0) + 
          ISNULL([sonst_z],0) - 
          ISNULL([ff],0)),0)  AS UMSATZSUMME 

    FROM [dbo].[schichten] 

    ) AS SOURCE 
    PIVOT (SUM([UMSATZSUMME]) FOR [MONTHYEAR] IN ('+ @ColumnName + N')) AS UMSAETZE) 
SELECT *, '+ @Gesamtergebnis +' AS Gesamtergebnis FROM temp ORDER BY '+ @ASSelector +'' 

EXEC sp_executesql @sql 

END 

END TRY 
BEGIN CATCH 
END CATCH 

SET @id = @id + 1; 

END 

GO 

Ich hoffe, ich dass es jemanden gibt, der mir helfen kann.

Antwort

0

Sie müssen die create procedure separat ausführen, also wenn Sie es in eine Variable einpacken und exec sp_executesql verwenden, sollte es funktionieren.

IF object_id('tempdb.dbo.#database') is not null 
    drop TABLE #database 
GO 

CREATE TABLE #database(id INT identity primary key, name sysname) 
GO 

SET NOCOUNT ON 

INSERT INTO #database(name) 
    SELECT name 
    FROM sys.databases 
    WHERE source_database_id is null 
    ORDER BY name 

SELECT * FROM #database 

DECLARE @id INT, @cnt INT, @sql NVARCHAR(MAX), @currentDb SYSNAME; 

SELECT @id = 1, @cnt = max(id) FROM #database 

WHILE @id <= @cnt 
BEGIN 
    BEGIN TRY 
     SELECT @currentDb = name 
     FROM #database 
     WHERE id = @id 

     IF OBJECT_ID(@currentDb+'.dbo.schichten') IS NOT NULL 
     begin 
      set @sql = 'CREATE PROCEDURE '[email protected]+'.[dbo].[Ausw_Tabelle_Taxi_Pers_Jahr] 
       @ColumnName nvarchar(MAX), 
       @Selector nvarchar(MAX), 
       @Gesamtergebnis nvarchar(MAX) 
      AS 
      BEGIN 
       SET NOCOUNT ON; 

       DECLARE @sql1 AS NVARCHAR(MAX), 
         @ASSelector nvarchar(MAX), 
         @IFPers nvarchar(MAX); 

       IF @Selector = ''konz'' 
       BEGIN 
        SET @ASSelector = ''Taxi'' 
        SET @IFPers='''' 
       END 
       ELSE 
       BEGIN 
        SET @ASSelector = ''Personal'' 
        SET @IFPers = ''[name] AS Name,'' 
       END 

       SET @sql1 = N'';WITH temp AS (SELECT * 
         FROM (
    SELECT 
      ISNULL((DATENAME(m,[datum])+ cast(datepart(yyyy,[datum]) as varchar(5))),0) AS MONTHYEAR, 
      ISNULL([''+ @Selector +''],0) AS ''+ @ASSelector +'',''+ @IFPers +''    
      ISNULL((ISNULL([umsum],0) + 
          ISNULL([sonst_0],0) + 
          ISNULL([sonst_7],0) + 
          ISNULL([sonst_16],0) + 
          ISNULL([sonst_z],0) - 
          ISNULL([ff],0)),0)  AS UMSATZSUMME 

    FROM [dbo].[schichten] 

    ) AS SOURCE 
    PIVOT (SUM([UMSATZSUMME]) FOR [MONTHYEAR] IN (''+ @ColumnName + N'')) AS UMSAETZE) 
SELECT *, ''+ @Gesamtergebnis +'' AS Gesamtergebnis FROM temp ORDER BY ''+ @ASSelector +'''' 

EXEC sp_executesql @sql1 

END' 
EXEC sp_executesql @sql 
END TRY 
BEGIN CATCH 
END CATCH 

SET @id = @id + 1; 

END 

GO 
0

Angenommen, dies ist eine einmalige Notwendigkeit zu einer nächtlichen Wartungsaufgabe Gegensatz, können Sie eine integrierte gespeicherte Prozedur verwenden, sys.sp_MSforeachdb, eine Erklärung in jeder Datenbank auszuführen. Es ist sicher zu bedienen und wurde ausführlich im Internet diskutiert. Es handelt sich jedoch um eine nicht dokumentierte Funktion, die ohne Vorankündigung von Microsoft entfernt werden kann, damit Sie nicht auf wiederkehrende Aufgaben angewiesen sind.

Erstellen und validieren Sie Ihre Anweisung in einer Datenbank und verwenden Sie dann diese gespeicherte Prozedur, um sie in allen Datenbanken auszuführen. ? ist der Platzhalter für den Datenbanknamen.

EXEC sys.sp_MSforeachdb @command1 = 
    'IF OBJECT_ID(''?.dbo.schichten'') IS NOT NULL 
    AND OBJECT_id(''?.[dbo].[Ausw_Tabelle_Taxi_Pers_Jahr]'') IS NOT NULL 
BEGIN 
CREATE PROCEDURE ?.[dbo].[Ausw_Tabelle_Taxi_Pers_Jahr] 
       @ColumnName nvarchar(MAX), 
       @Selector nvarchar(MAX), 
       @Gesamtergebnis nvarchar(MAX) 
      AS 
      BEGIN 
       SET NOCOUNT ON; 

       DECLARE @sql1 AS NVARCHAR(MAX), 
         @ASSelector nvarchar(MAX), 
         @IFPers nvarchar(MAX); 

       IF @Selector = ''konz'' 
       BEGIN 
        SET @ASSelector = ''Taxi'' 
        SET @IFPers='''' 
       END 
       ELSE 
       BEGIN 
        SET @ASSelector = ''Personal'' 
        SET @IFPers = ''[name] AS Name,'' 
       END 

       SET @sql1 = N'';WITH temp AS (SELECT * 
         FROM (
    SELECT 
      ISNULL((DATENAME(m,[datum])+ cast(datepart(yyyy,[datum]) as varchar(5))),0) AS MONTHYEAR, 
      ISNULL([''+ @Selector +''],0) AS ''+ @ASSelector +'',''+ @IFPers +''    
      ISNULL((ISNULL([umsum],0) + 
          ISNULL([sonst_0],0) + 
          ISNULL([sonst_7],0) + 
          ISNULL([sonst_16],0) + 
          ISNULL([sonst_z],0) - 
          ISNULL([ff],0)),0)  AS UMSATZSUMME 

    FROM [dbo].[schichten] 

    ) AS SOURCE 
    PIVOT (SUM([UMSATZSUMME]) FOR [MONTHYEAR] IN (''+ @ColumnName + N'')) AS UMSAETZE) 
SELECT *, ''+ @Gesamtergebnis +'' AS Gesamtergebnis FROM temp ORDER BY ''+ @ASSelector +'''' 

EXEC sp_executesql @sql1 

END 
' 
Verwandte Themen