2009-11-18 33 views
0

我想搜索所有存儲過程以查找子字符串「x」,我可以在 SQL 2000中執行此操作嗎? 2005? 2008?SQL Server代碼搜索工具

..沒有任何加載項?

如果不是,每個最佳可用的免費插件是什麼?

對不起。我應該提到,我知道如何使用sysobjects數據來做到這一點。但在我看來,在這個功能前應該有一個很好的GUI!

例如,事情是這樣的:

http://screencast.com/t/Y2Q0YmU0Nzkt

+0

重複:http://stackoverflow.com/questions/1364633/search-for-a-key-word-in-all-the-stored-procs-爲一個-given-db – 2009-11-18 04:34:49

+0

對不起。我應該提到,我知道如何使用sysobjects數據來做到這一點。但在我看來,在這個功能前應該有一個很好的GUI! – ChadD 2009-11-18 04:35:13

回答

0

如果我是你,我不會使用工具 - 只要運行一個腳本來執行搜索爲你,即下面的SQL腳本搜索在數據庫中的所有存儲的特效爲一個字符串

Declare @search varchar(128) 

SET @search = '%' + 'search text' + '%' 


/***************************************************************************/ 

SELECT o.name As "Stored Procedures" 

      FROM SYSOBJECTS o INNER JOIN SYSCOMMENTS c 
         ON o.id = c.id 
      WHERE c.text LIKE @search 
         AND o.xtype = 'P' 
      GROUP BY o.name 
      ORDER BY o.name 

/**************************************************************************/ 

在這種情況下的xtype「P」指的是存儲過程

+0

syscomments只存儲nvarchar(4000),所以如果4個字母的搜索字符串在3999開始,所以這是不可靠的,所以這是不可靠的 – gbn 2009-11-18 05:09:21

+0

有趣的 - 我不知道,謝謝你的頭。 – Scozzard 2009-11-19 20:30:53

2

還回答here

http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=32319

CREATE PROCEDURE sp_FindText @text varchar(8000), @findtype varchar(1)='P' AS 
SET NOCOUNT ON 
IF @findtype='P' SELECT DISTINCT Len(SubString(text,1, PatIndex('%' + @text + '%', text)))-Len(Replace(SubString(text,1, PatIndex('%' + @text + '%', text)),char(13),''))+1 AS Line, 
--PatIndex('%' + @text + '%', text) AS Position, 
OBJECT_NAME(id) AS ProcName 
FROM syscomments 
WHERE text like '%' + @text + '%' 
ORDER BY ProcName, Line 

IF @findtype='C' EXEC('SELECT TABLE_NAME + ''.'' + COLUMN_NAME AS TableColumn FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME LIKE ''%' + @text + '%'' ORDER BY TableColumn') 

IF @findtype='T' EXEC('SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE ''%' + @text + '%'' ORDER BY TABLE_NAME') 
GO 

它不僅搜索過程和視圖定義的文本,它也會找到表,視圖和列名:

EXEC sp_FindText 'myTable' --or-- EXEC sp_FindText 'myTable', 'P' --finds procedures/views containing 'myTable' in their definition/code 
EXEC sp_FindText 'myTable', 'T' --finds tables/views containing 'myTable' in their name 
EXEC sp_FindText 'myCol', 'C' --finds columns containing 'myCol' in their name 
+0

syscomments只存儲nvarchar(4000),所以如果4個字母的搜索字符串在3999開始,所以這是不可靠的 – gbn 2009-11-18 05:08:45

+0

請停止投票一個明顯錯誤的答案,將給出誤導結果 – gbn 2009-11-19 18:39:39

+0

我承認這可能會錯過搜索如果它跨過4000個字符的邊界。查看我們數據庫中的2個數據庫的快速示例,其中一個數據庫中有14個數據庫中的14個數據庫,另一個數據庫中的大於4000個字符的468個對象中有33個數據庫。我想你必須非常不幸地錯過一個搜索詞。代替更好的東西,我對這種方法很滿意。 – 2009-11-19 23:16:52

1

對於SQL Server 2005和2008,使用供應nvarchar(最大)輸出的sys.sql_modulesOBJECT_DEFINITION

SELECT OBJECT_NAME(object_id) FROM sys.sql_modules WHERE definition LIKE @MyString 
SELECT name FROM sys.objects WHERE OBJECT_DEFINITION(object_id) LIKE @MyString 

對於SQL Server 2000,您必須使用sycomments或INFORMATION_SCHEMA.ROUTINES,但它們提供nvarchar(4000),所以不可靠。你必須Concat的sys.comments成文本值和搜索(坦白地說我已經忘記了如何做到這一點把我的頭頂部),其中完全一樣的問題被提及