Sql-Server

顯示所有儲存過程定義(內容)以進行編輯

  • May 8, 2020

抱歉,如果以前有人問過這個問題,建議的“相關”問題不相關,我自己的搜尋結果很少。

我需要列出所有儲存過程的定義(程式碼),這樣我就可以開始處理所有 450 個儲存過程並添加分號以實現 v2014 標準。

我在這裡找到了以下程式碼並稍作修改:

SELECT
   obj.Name AS SPName,
   REPLACE(modu.definition, 'CREATE PROC', 'ALTER PROC') + 'GO' AS SPDefinition
FROM
   sys.sql_modules modu INNER JOIN
   sys.objects obj ON modu.object_id = obj.object_id
WHERE
   (obj.type = 'P')
ORDER BY
   obj.name;

上面的程式碼是使用 SA 帳戶執行的。

認為這正是我所需要的,但是,我剛剛注意到 MSDN 上有人聲稱它沒有按預期 顯示全文。

將結果粘貼到 SSMS 編輯器中時,我有 46,000 行程式碼需要處理,因此如果有任何遺漏,我看不到。我想確保在編輯器中浪費一天之前我已經正確地開始了這個過程。

因此,我正在聯繫您的專業人士,詢問這是否是這種方法的真正缺點,或者是否有替代方法而不是一種方法?

sys.sql_modulesMSDN上提到的問題與or無關OBJECT_DEFINITION();他們誤解了這個問題。實際發生的情況是它們被 Management Studio 中的輸出限制所阻撓,預設情況下,在結果到文本的任何輸出元組中僅顯示 255 個字元,最多顯示 8192 個字元。

因此,首先,確保將其更改為 8192:

工具 > 選項 > 查詢結果 > SQL Server > 結果到文本 >

每列中顯示的最大字元數

現在您可以為所有小於 4K 的程序製作一個腳本:

SELECT REPLACE(m.definition, N'CREATE PROC', N'ALTER PROC') 
 + CHAR(13) + CHAR(10) + N'GO'
FROM sys.sql_modules AS m
INNER JOIN sys.procedures AS p
ON m.[object_id] = p.[object_id]
WHERE LEN(m.definition) <= 4000
ORDER BY p.name;

(當然,您的替換是天真的 - 如果他們有create procedure(多個空格)或者您使用區分大小寫的排序規則怎麼辦?您可能必須手動修復其中一些。)

現在,您只需要擔心為更大的過程手動派生腳本。首先,看看你有沒有:

SELECT name 
 FROM sys.procedures 
 WHERE LEN(OBJECT_DEFINITION([object_id])) > 4000; 

在這裡討論了一些解決方法(在動態 SQL 的上下文中,但如果你分配OBJECT_DEFINITION()給一個變數也是如此)。

Magoo 先生是對的,如果您使用 Management Studio 中的腳本功能,您將獲得完整的定義,而不必擔心截斷:

  • 右鍵點擊一個過程,modifyscript as > alter to >
  • 在對象資源管理器詳細資訊中,執行與上述相同的操作,但對於多個
  • 右鍵點擊數據庫,tasks > generate scripts >(但這確實CREATE,不是ALTER,因此您仍需要執行替換)

順便說一句,當您在任何地方添加分號時,我還建議確保您的所有過程都是使用模式前綴創建的(例如dbo.procedurename,不僅僅是procedurename),以及過程中的所有對象引用。在缺少分號之前,這些很可能會導致問題。在執行更改時還要記住一些一般事項。

引用自:https://dba.stackexchange.com/questions/108642