2011-08-15 67 views
0

有沒有辦法讓程序在所有過程中搜索和替換特定的字符串?在SQL Server中的過程中替換字符串

+0

請多一些信息。你是否試圖搜索每個表格或特定字段的每個字段? – Marc

+0

我試圖替換SQL存儲過程中與軟件本身互動的評論,但有太多的程序手動執行它,一個接一個 –

+2

因此,您試圖批量更新存儲過程定義,然後不是用戶表內容? –

回答

2

也許修復應用程序會更容易。爲什麼軟件關心評論?它是否也擴展屬性barf?

假設註釋始終是相同的,在Management Studio與運行結果這個文本:

SET NOCOUNT ON; 

SELECT 'GO 
    ' + REPLACE([definition], '/* offending comment */', '') 
    FROM sys.sql_modules 
    WHERE [definition] LIKE '%/* offending comment */%'; 

這將產生一系列由GO分離CREATE PROCEDURE命令。如果在存儲過程主體中有實際的CREATE PROCEDURE字符串,則您無需爲CREATE PROCEDURE進行搜索/創建並將其更改爲ALTER。因此,你可以拉這些結果到你喜歡的文本編輯器,並做了搜索和替換爲:

GO 
CREATE PROCEDURE 

與替換它:

GO 
ALTER PROCEDURE 

(雖然這個假設你沒有意見CREATE PROCEDURE前行如果你這樣做,你會如果你不需要擔心包含一個有效的字符串CREATE PROCEDURE程序需要得到您更多的創意和替換)

- 一個d假設你的語法實際上是CREATE PROCEDURE,而不是CREATE PROCCREATEPROC之間和你的系統不區分大小寫,您使用create procCreate Proc隨機間距......

SET NOCOUNT ON; 

SELECT 'GO 
    ' + REPLACE(REPLACE([definition], '/* offending comment */', ''), 
    'CREATE PROCEDURE', 'ALTER PROCEDURE') 
    FROM sys.sql_modules 
    WHERE [definition] LIKE '%/* offending comment */%'; 

如果你不關心與您的存儲過程相關的現有有形事物,例如權限,你也可以這樣來做:

SELECT 'DROP PROCEDURE ' 
    + QUOTENAME(OBJECT_SCHEMA_NAME([object_id])) 
    + '.' + QUOTENAME(OBJECT_NAME([object_id])) + '; 
    ' + 'GO 
    ' + REPLACE([definition], '/* offending comment */', '') 
FROM sys.sql_modules 
WHERE [definition] LIKE '%/* offending comment */%'; 

這將生成一個腳本,更接近於準備走了,因爲它只是下降的過程並重新創建它(所以並不需要改變CREATEALTER),但由於權限和/或依賴關係,您可以刪除並重新創建對象的情況並不常見。

CREATE OR REPLACE或者類似的DDL會讓這個腳本更容易編寫出來。如果你覺得這將是一個有價值的除了SQL Server中,請投給了以下建議(並添加你的使用情況,或者爲什麼你認爲這將是寶貴的,對評論):

http://connect.microsoft.com/SQLServer/feedback/details/127219/create-or-replace

+0

非常感謝您的解釋!關於干擾的評論,其原因在於它不存在/不存在的一條線,並且由於我們正在討論大量程序和線條,因此需要手動完成。 –

+0

哦,確認!謝謝亞倫伯特蘭非常有用的腳本。我有一組存儲過程在2個表上運行「更新統計信息」,我不得不改變他們說「更新統計信息與fullscan,列」。這(你的第二個)完成了我想做的事 - 生成ALTER腳本。與「sp_MSforEachDB」循環集成在一起! – NateJ

+0

不,請不要使用sp_msforeachdb:http://sqlblog.com/blogs/aaron_bertrand/archive/2010/12/29/a-more-reliable-and-more-flexible-sp-msforeachdb.aspx –

0

如何關於將所有這些存儲過程的腳本生成爲.sql文件,然後在CTRL + H的幫助下替換該生成文件中的註釋。難道不是更簡單的選項嗎?

+0

它可能是,但是如果有5,000個過程,並且只有150個過程包含註釋...所以如果要將它限制爲包含註釋的過程(需要'WHERE'子句),爲什麼不添加'REPLACE ()'調用之前,你得到的輸出? –

+0

我絕對看到你的觀點。但是,如果我們通過嚮導生成它,腳本的格式保持不變。而如果我們運行自己的查詢來獲取此信息,我認爲格式化會花費一些時間,我想知道它是否會混淆作者。如果所有的註釋都在SP的開頭,那應該沒問題,但是如果我們想要替換那個SP中的特定代碼塊的註釋呢? – vmvadivel

+0

爲什麼要格式化「折騰」?也許如果您將結果用於網格,但文本結果應該是準確的(只要沒有一個過程長於最大文本輸出)。至於評論的類型以及評論在程序主體中的位置,這兩個都不重要,儘管我們不知道是由於缺乏問題的細節。 –