2014-12-04 39 views
0

我們有一些數據庫有很多的視圖,函數和程序。 我們會更新其中一些。所以我寫了這個腳本。 我的問題是,這是一種常見的方式,是正確的方式?mssql批量更新程序和函數

任何建議將不勝感激。

-- update procedures and functions 
USE mydb 
GO 
DECLARE @ticker nvarchar(255) 
DECLARE @definition nvarchar(max) 
DECLARE @newdefinition nvarchar(max) 
DECLARE crsVorgang SCROLL CURSOR FOR 
    SELECT ROUTINE_NAME,ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES 
    WHERE ROUTINE_CATALOG = 'mydb' and ROUTINE_DEFINITION like '%something%' 
    ORDER BY ROUTINE_NAME 

     OPEN crsVorgang 
     FETCH FIRST FROM crsVorgang INTO @ticker, @definition 

     WHILE (@@FETCH_STATUS <> -1) 
     BEGIN 

      set @newdefinition = REPLACE(@definition,'sometext', 'newtext') 

      --print @newdefinition 
      update INFORMATION_SCHEMA.ROUTINES 
      set ROUTINE_DEFINITION = @newdefinition 
      where ROUTINE_NAME = @ticker 

     FETCH NEXT FROM crsVorgang INTO @ticker, @definition 
     END 
    CLOSE crsVorgang 
    DEALLOCATE crsVorgang 
GO 
+0

作爲第一個響應,我在一個測試系統上嘗試了它,並得到以下消息:系統目錄的臨時更新是不允許的。 – MattOpen 2014-12-04 10:55:39

+0

你想要完成什麼?從上面的腳本中不太清楚。 – Andreas 2014-12-04 12:02:14

回答

0

答案是,更新INFORMATION_SCHEMA.ROUTINES是不可能的,因爲它是不允許的。

正確的方式(對我來說)從大量的程序和功能的reproduceable批量更新現在是一個下拉創造,所以我修改了我的腳本以下到:

USE [mydb] 
GO 
DECLARE @ticker nvarchar(255) 
DECLARE @definition nvarchar(max) 
DECLARE @routinetype nvarchar(255) 
DECLARE @newdefinition nvarchar(max) 
DECLARE @dropdefinition nvarchar(max) 
DECLARE crsVorgang SCROLL CURSOR FOR 
    SELECT ROUTINE_NAME,ROUTINE_DEFINITION, ROUTINE_TYPE FROM INFORMATION_SCHEMA.ROUTINES 
    WHERE ROUTINE_CATALOG = 'mydb' and ROUTINE_DEFINITION like '%something%' 
    ORDER BY ROUTINE_NAME 

     OPEN crsVorgang 
     FETCH FIRST FROM crsVorgang INTO @ticker, @definition, @routinetype 

     WHILE (@@FETCH_STATUS <> -1) 
     BEGIN 

      set @dropdefinition = 'DROP '+ @routinetype +' [dbo].'[email protected] 
      set @newdefinition = REPLACE(@definition,'sometext', 'newtext') 

      exec (@dropdefinition) 
      exec (@newdefinition) 

     FETCH NEXT FROM crsVorgang INTO @ticker, @definition, @routinetype 
     END 
    CLOSE crsVorgang 
    DEALLOCATE crsVorgang 
GO 

感謝您的廢時間