已解決:在所有存儲過程sql server中查找列

最後更新: 09/13/2023

在 SQL Server 中使用大型數據庫時,您可能不可避免地會遇到需要在所有存儲過程中查找特定列的情況。 如果您正在重構代碼、尋找錯誤或只是對過程中列的使用感到好奇,則可能會出現這種情況。 不管出於什麼原因,在 SQL Server 中定位列似乎是一項艱鉅的任務,但不用擔心,使用正確的 SQL 腳本,這可以變得快速而簡單。

我們可以使用“INFORMATION_SCHEMA.ROUTINES”表或“sys.sql_modules”來實現這一點,其中每個過程的文本都存儲在 SQL Server 中。

[b] 讓我們實際看看如何在 SQL Server 中的所有存儲過程中查找列。 [/b]

解決方案概述

我們的基本策略是查詢“INFORMATION_SCHEMA.ROUTINES”表(或“sys.sql_modules”)以檢索每個存儲過程的定義。 然後我們可以使用“LIKE”語句在這些定義中搜索我們的列。 就這麼簡單!

如果您希望在自己的 SQL Server 環境中完成此操作,您可以使用以下通用查詢:

SELECT 
    ROUTINE_NAME, ROUTINE_DEFINITION
FROM 
    INFORMATION_SCHEMA.ROUTINES 
WHERE 
    ROUTINE_DEFINITION LIKE '%ColumnName%'
    AND ROUTINE_TYPE='PROCEDURE'

分步代碼說明

1. 選擇必要的信息

我們首先從“INFORMATION_SCHEMA.ROUTINES”中選擇“ROUTINE_NAME”和“ROUTINE_DEFINITION”。

2. 過濾定義

然後,我們使用“WHERE”子句來過濾“ROUTINE_DEFINITION”。 我們只對“ROUTINE_DEFINITION”包含列名的行感興趣。

3. 限制於存儲過程

最後,我們在“WHERE”子句中添加另一個條件,以將結果集限制為僅存儲過程的例程。

使用 sys.sql_modules 的替代方法

上面的查詢非常適合在存儲過程中查找列名。 但是,還有另一種方法可以獲取相同的信息。 我們可以使用“sys.sql_modules”系統視圖來獲取 SQL Server 模塊的文本。 它包括存儲過程、函數、觸發器等的定義。

SELECT Object_name(sm.object_id) as name, sm.definition
FROM sys.sql_modules AS sm
JOIN sys.objects AS o ON sm.object_id = o.object_id
WHERE sm.definition like '%ColumnName%'
AND type_desc = 'SQL_STORED_PROCEDURE'

使用 SQL 通配符

SQL 通配符在這裡非常有用。 如果您不確定列名之前或之後是否可能存在空格或其他字符,則可以使用“%”通配符(例如“% ColumnName %”)來包含可能存在的任何字符。

通過這些簡單的步驟,您現在可以輕鬆地在 SQL Server 中的所有存儲過程中找到列。 此類功能的實用性不僅限於查找列,還可以擴展到您希望在存儲過程中發現的任何文本。

相關文章: