2017-02-21 39 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]+'.[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

假設這是相對於一個夜間維護任務一次需要,你可以使用內置的存儲過程,sys.sp_MSforeachdb,在每個數據庫中執行語句。這是安全的使用,並已在網絡上進行了廣泛的討論。但是,這是一個未公開的功能,可以在未經Microsoft通知的情況下將其刪除,因此您不希望依賴它來執行重複性任務。

在一個數據庫中創建並驗證您的語句,然後使用此存儲過程在所有數據庫中執行它。 ?是數據庫名稱的佔位符。

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 
' 
相關問題