2015-06-24 50 views
0

MsSql中有一個存儲過程。我想添加這個存儲過程只需一行額外的代碼,但我想在大約20個數據庫中完成。所以顯然我不想右鍵單擊>修改它們中的每一個。我想創建一個腳本來做到這一點,但問題是,這個存儲過程的修改腳本大約是550行,我不想將所有這些行添加到我的升級腳本中,因爲已經有數千行腳本中的行。在沒有修改的情況下將額外代碼添加到存儲過程

我發現了這樣的解決方案;它基本上做的是獲取存儲過程的創建腳本,找到一個特定的唯一行('append_5 = zr.append_5,')並將其替換爲我想要的行('append_5 = zr.append_5,before_head = zr.before_head,before_body = zr.before_body,')。

Declare @prDefinition nvarchar(MAX); 
SET @prDefinition = (select object_definition(object_id) proceduredefinition from sys.procedures where name = 'cms_asp_approval_approve_zone_revision') 
IF CHARINDEX('append_5 = zr.append_5, before_head = zr.before_head, before_body = zr.before_body,',@prDefinition) <= 0 
BEGIN 
SET @prDefinition = REPLACE(@prDefinition,'append_5 = zr.append_5,','append_5 = zr.append_5, before_head = zr.before_head, before_body = zr.before_body,') 
SET @prDefinition = REPLACE(@prDefinition,'CREATE procedure [dbo].[cms_asp_approval_approve_zone_revision]','ALTER procedure [dbo].[cms_asp_approval_approve_zone_revision]') 
EXEC (@prDefinition) 
END 
GO 

這工作正常,但這當然是最壞的情況下,真的是沒有任何保證。你有什麼更專業的方法來解決這個問題?

編輯:我當然知道創建一個「ALTER」腳本可以解決這個問題,但它給了我550個額外的行,我不想要。我想要一個較短的腳本。

+0

不太清楚,如果我理解正確的問題。所有20個數據庫中存儲的數據庫是否相同,並且您需要應用相同的更改? –

+0

是的,確切地說。他們都是一樣的,我想要應用相同的更改 –

+0

然後,只需在某些數據庫中爲您的過程創建更改腳本,應用更改,然後將此腳本應用於所有數據庫 –

回答

0

這裏有一些誤解。你可以改變你的存儲過程,並且會在你編寫腳本時重新創建它。它不會附加到現有的存儲過程,它會改變它:

create stored procedure spTest 
as 

select 1 
select 2 
... 
select n 
go 

然後,只需改變你的程序:

alter stored procedure spTest 
as 

select 1 
select 2 
... 
select n 
select n + 1 
go 
+0

但是,這給我提供了大約550行代碼,我不想在升級腳本中增加550行,只需添加一行行 –

+0

你將不得不或只是使用你目前的黑客。爲什麼是這個限制? –

+0

我已經有數千行。這很難控制。而且我不需要,因爲我已經用5行代碼實現了它。但我想知道,如果有人知道更好,更專業的方式 –

相關問題