Sql-Server

如何跨多個伺服器/數據庫檢查我的 sp_Blitz/sp_WhoIsActive 版本?

  • May 31, 2020

我在我的 SSMS 中註冊了一堆 SQL Server,有很多不同的 SQL 版本、版本和數據庫兼容性。

我想檢查這些伺服器中是否有任何****安裝sp_Blitzsp_WhoIsActive儲存過程,以及它們是哪些版本。

我知道我可以右鍵點擊我的註冊伺服器組並打開一個連接到組中所有伺服器的查詢視窗,但是有沒有一種可靠的方法來檢查我擁有哪些 SProcs 和版本?

我設法通過嗅探 SProcs 原始碼中的版本(儲存在sys.comments表中)獲得了一個非常有用的列表。

T-SQL 結果截圖

做出了大量的假設,因此首先在一個單獨的測試實例上測試此程式碼,然後再在您的眾多生產伺服器上瘋狂……

編輯:添加 Adam Machanic 的sp_WhoIsActive作為如何添加到此掃描器腳本的範例。

USE [master];

IF OBJECT_ID('tempdb..##DBA_SProcs') IS NOT NULL
   DROP TABLE ##DBA_SProcs;

CREATE TABLE ##DBA_SProcs (
    DBName             NVARCHAR(100) NULL
   ,SProcName          NVARCHAR (50) NULL
   ,VersionString      NVARCHAR (50) NULL
   ,VersionDateString  NVARCHAR (50) NULL
   );

EXEC sys.sp_MSforeachdb
    @replacechar = N'¬'
   ,@command1 = N'
USE[¬];

INSERT INTO ##DBA_SProcs
SELECT
    DB_NAME() AS DBName
   ,LTRIM(RTRIM(
       REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
           SUBSTRING([text], CHARINDEX(''sp_Blitz'', [text], 1), 18)
           ,'']'','''')
           ,''('','''')
           ,CHAR(9)/*Tab*/,'' '')
           ,CHAR(10)/*LF*/,'' '')
           ,CHAR(13)/*CR*/,'' '')
           ,''@He'','''')
           ,''@Ch'','''')
       )) AS SProcName
   ,REPLACE(REPLACE(
       SUBSTRING([text], CHARINDEX(''T @Version'', [text], 1) + 3, 15)
       ,'', @'' , '''')
       ,''Version = '' , '''')
       AS VersionString
   ,REPLACE(REPLACE(
       CASE
       WHEN CHARINDEX('', @VersionD'', [text], 1) > 0
       THEN SUBSTRING([text], CHARINDEX('', @VersionD'', [text], 1) + 3, 24)
       ELSE SUBSTRING([text], CHARINDEX(''T @VersionD'', [text], 1) + 3, 24)
       END
       ,''VersionDate = '' , '''')
       ,'''''''' , '''')
       AS VersionDateString
FROM sys.syscomments sc
WHERE sc.colid <= 1
 AND sc.[text] LIKE ''%sp_Blitz%''
 AND sc.[text] LIKE ''%T @Version%'';

INSERT INTO ##DBA_SProcs
SELECT
    DB_NAME() AS DBName
   ,''sp_WhoIsActive'' AS SProcName
   ,SUBSTRING([text], CHARINDEX(''Who Is Active? v'', [text], 1) + 15,  7) AS VersionString
   ,REPLACE(
       SUBSTRING([text], CHARINDEX(''Who Is Active? v'', [text], 1) + 23, 10)
       ,''-'' , '''')
       AS VersionDateString
FROM sys.syscomments sc
WHERE sc.[text] LIKE ''%sp_WhoIsActive%''
 AND sc.[text] LIKE ''%Who Is Active? v%'';
';

SELECT *
FROM ##DBA_SProcs
ORDER BY DBName, SProcName;

IF OBJECT_ID('tempdb..##DBA_SProcs') IS NOT NULL
   DROP TABLE ##DBA_SProcs;

對於 sp_Blitz,在 Github 上送出了一個增強請求以添加 version 的輸出,如果您想影響工作的完成方式(或貢獻程式碼),歡迎您在那裡留下評論。

對於 sp_WhoIsActive,作者 Adam Machanic 正在考慮在每次執行時將輸出添加到 Messages 選項卡。

在那之前,奧利奧上面關於檢查程式碼的建議是最好的。我們不會故意破壞它——我們已經很多年沒有改變這些字元串了,也不打算開始,呵呵。

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