SQL Server通過條件搜索獲取相關的存儲過程等對象

来源:https://www.cnblogs.com/kerrycode/archive/2019/10/22/11719015.html
-Advertisement-
Play Games

在SQL Server中,我們經常遇到一些需求,需要去搜索存儲過程(Procedure)、函數(Function)等對象是否包含某個對象或涉及某個對象,例如,我需要查找那些存儲過程、函數是否調用了鏈接伺服器(LINKED SERVER),我們如果從sys.sql_modules去搜索的話,如果有多個... ...


   在SQL Server中,我們經常遇到一些需求,需要去搜索存儲過程(Procedure)、函數(Function)等對象是否包含某個對象或涉及某個對象,例如,我需要查找那些存儲過程、函數是否調用了鏈接伺服器(LINKED SERVER),我們如果從sys.sql_modules去搜索的話,如果有多個用戶資料庫,需要切換資料庫,執行多次SQL語句。這些都是非常麻煩的事情。本著“模塊化定製腳本,減少重覆工作量”的原則。寫了一個腳本find_prc_from_src_txt.sql, 以後在根據不同的需求逐步完善!

--==================================================================================================================
--        ScriptName          :            find_prc_from_src_txt.sql
--        Author              :            瀟湘隱者    
--        CreateDate          :            2019-10-22
--        Description         :            在SQL Server實例中通過條件搜索所有資料庫的存儲過程、函數、視圖,找出這些對象
--        Note                :            
/*******************************************************************************************************************
        Parameters            :                                    參數說明
********************************************************************************************************************
            @src_text         :            你要搜索的條件,例如,想找出那些存儲過程有調用某個鏈接伺服器:@src_text=xxxx
********************************************************************************************************************
        Notice                :            由於效率問題,有時候會被阻塞,在tempdb等待LCK_M_SCH_S
********************************************************************************************************************
   Modified Date    Modified User     Version                 Modified Reason
********************************************************************************************************************
    2019-10-22        瀟湘隱者         V01.00.00        新建該腳本。
*******************************************************************************************************************/
--==================================================================================================================
 
DECLARE @cmdText        NVARCHAR(MAX);
DECLARE @database_name  NVARCHAR(64);
DECLARE @src_text        NVARCHAR(128);
 
 
SET @src_text='xxxx' --根據實際情況輸入查詢、搜索條件
 
IF OBJECT_ID('TempDB.dbo.#databases') IS NOT NULL
    DROP TABLE dbo.#databases;
 
CREATE TABLE #databases
(
    database_id     INT,
    database_name   sysname
);
 
INSERT  INTO #databases
SELECT  database_id ,
        name
FROM    sys.databases
WHERE name NOT IN ('model') AND state = 0; --state_desc=ONLINE 
 
IF OBJECT_ID('TempDB.dbo.#sql_modules') IS NOT NULL
    DROP TABLE #sql_modules;
 
/**********************************************************************************************************
此處如果用這種寫法,就會報下麵錯誤,所以用下麵這種寫法。
SELECT '' AS database_name,  t.* INTO #sql_modules   
FROM sys.sql_modules t WITH(NOLOCK) WHERE 1=0;
------------------------------------------------------------------------———----------------------------
Msg 8152, Level 16, State 2, Line 2
將截斷字元串或二進位數據。
**********************************************************************************************************/
SELECT 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' AS database_name
    ,  t.* INTO #sql_modules   
FROM sys.sql_modules t WITH(NOLOCK) WHERE 1=0;
 
 
WHILE 1= 1
BEGIN
 
 
    SELECT TOP 1 @database_name= database_name   
    FROM #databases
    ORDER BY database_id;
 
    IF @@ROWCOUNT =0 
        BREAK;
 
 
    SET @cmdText =  N'USE ' + QUOTENAME(@database_name) + N';' +CHAR(10)
 
    //**********************************************************************************************************
    SELECT @cmdText += N'INSERT INTO ##sql_modules
    SELECT  *
    FROM    sys.sql_modules W
    WHERE   definition LIKE ''%@p_src_text%'';' + CHAR(10);
 
    
    EXEC SP_EXECUTESQL @cmdText, N'@p_src_text NVARCHAR(128)',@p_src_text=@src_text;
 
    此種方式不生效。這裡棄用這種動態SQL執行方式
    ***********************************************************************************************************/
    SELECT @cmdText += N'INSERT INTO #sql_modules
                       SELECT @p_database_name
                             , t.*
                       FROM    sys.sql_modules t WITH(NOLOCK)
                       WHERE   definition LIKE ''%' +@src_text +'%'';' + CHAR(10);
    EXEC SP_EXECUTESQL @cmdText,N'@p_database_name NVARCHAR(64)',@p_database_name=@database_name;
    
    DELETE FROM #databases WHERE database_name=@database_name;
END
 
SELECT * FROM tempdb.dbo.#sql_modules;
 
 
 
IF OBJECT_ID('TempDB.dbo.#databases') IS NOT NULL
    DROP TABLE dbo.#databases;
IF OBJECT_ID('TempDB.dbo.#sql_modules') IS NOT NULL
    DROP TABLE #sql_modules;

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • DCL(Data Control Language)語句:數據控制語句,用於控制不同數據段直接的許可和訪問級別的語句。這些語句定義了資料庫、表、欄位、用戶的訪問許可權和安全級別。 ...
  • mysql查看資料庫性能常用命令 mysql> show global status; 可以列出MySQL伺服器運行各種狀態值,另外,查詢MySQL伺服器配置信息語句: mysql> show variables; 一、慢查詢 mysql> show variables like '%slow%'; ...
  • 之前寫過一篇博客“SQL Server中是否可以準確獲取最後一次索引重建的時間?“,裡面主要講述了三個問題:我們能否找到索引的創建時間?最後一次索引重建(Index Rebuild)的時間? 最後一次索引重組(INDEX REORGANIZE)的時間呢?,當時得出的結論,答案是我們無法準確的找到索引... ...
  • server has gone away: 如下圖 執行以下命令 @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_MODE = ON: 如下圖 修改要導入的sql數據文件(data.sql),註釋或者去掉類似以下內容的代碼: SET @ ...
  • 有兩張表,info1, info2 。 info1: info2: 現在,要用info2中的數據更新info1中對應的學生信息,sql語句如下: 運行結果如下: 更新過的info1: 至於效率問題,之前我有三張表,都在40萬左右。需要將 table2 中的兩個欄位(step1),table3 中的一 ...
  • 1、 在百度搜索mysql,點擊mysql官網上下載mysql的地址 在url直接輸入mysql的下載地址也可以:https://dev.mysql.com/downloads/mysql/ 如圖: 因為下載的是免費版,所有隻選擇 Community_Server 點開後,在“Select Oper ...
  • ########################## 今天來說一下MySQL資料庫的一些基本操作 ########################## 1.創建資料庫 create database db1; //db1是資料庫名 2.查看當前存在的資料庫 show database db1; 3. ...
  • 工作中oracle資料庫安裝完成後,需要修改預設的密碼有效期,預設為180天,如果不修改,到期忘記更改密碼可能會造成不必要的影響。 兩種修改方式pl/sql或者cmd視窗 1、pl/sql修改預設密碼有效期 通過語句查詢可以發現,預設有效期為6個月。執行下行語句,更改有效期為不限制 2、使用cmd窗 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...