顯示所有儲存過程定義(內容)以進行編輯
抱歉,如果以前有人問過這個問題,建議的“相關”問題不相關,我自己的搜尋結果很少。
我需要列出所有儲存過程的定義(程式碼),這樣我就可以開始處理所有 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_modules
MSDN上提到的問題與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 中的腳本功能,您將獲得完整的定義,而不必擔心截斷:
- 右鍵點擊一個過程,
modify
或script as > alter to >
- 在對象資源管理器詳細資訊中,執行與上述相同的操作,但對於多個
- 右鍵點擊數據庫,
tasks > generate scripts >
(但這確實CREATE
,不是ALTER
,因此您仍需要執行替換)順便說一句,當您在任何地方添加分號時,我還建議確保您的所有過程都是使用模式前綴創建的(例如
dbo.procedurename
,不僅僅是procedurename
),以及過程中的所有對象引用。在缺少分號之前,這些很可能會導致問題。在執行更改時還要記住一些一般事項。