2017-02-21 7 views
0

テーブルschichtenを含む既存のすべてのデータベースに次のストアドプロシージャを追加します。私のアプローチはすべて失敗したので、私はここで助けを求めています。特定のテーブルを持つすべてのデータベースの動的ストアドプロシージャの作成

これは私のアプローチです:

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 

私は私を助けることができる誰かがあることを期待しています。

答えて

0

create procedureを別々に実行する必要があるため、変数にまとめてexec sp_executesqlを使用するとうまくいくはずです。

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]rrentDb+'.[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

これは夜間のメンテナンス作業とは対照的に、1時間が必要であると仮定すると、各データベースでステートメントを実行するために、組み込みのストアドプロシージャ、sys.sp_MSforeachdbを使用することができます。安全に使用することができ、Web上で広範に議論されています。ただし、これは文書化されていない機能であり、Microsoftによって予告なく削除される可能性があるため、定期的な作業には依存したくありません。

1つのデータベースでステートメントを作成して検証し、このストアドプロシージャを使用してすべてのデータベースでステートメントを実行します。 ?データベース名のプレースホルダです。

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 
' 
関連する問題