【发布时间】:2013-03-19 20:46:25
【问题描述】:
在 Visual Studio 2k8 中,我按下 Ctrl-F,然后键入一些我想在我的项目中搜索的文本。我可以一次快速搜索多个文件。
我有一个带有一些存储过程的 SQL Server。如何轻松地在存储过程中搜索任意字符串?我知道我可以在 SQL Server Studio 中列出一个存储过程的文本并从那里进行 Ctrl-F 搜索,但我想一次搜索它们。
【问题讨论】:
在 Visual Studio 2k8 中,我按下 Ctrl-F,然后键入一些我想在我的项目中搜索的文本。我可以一次快速搜索多个文件。
我有一个带有一些存储过程的 SQL Server。如何轻松地在存储过程中搜索任意字符串?我知道我可以在 SQL Server Studio 中列出一个存储过程的文本并从那里进行 Ctrl-F 搜索,但我想一次搜索它们。
【问题讨论】:
SQL Search(来自 Redgate)是你的朋友。免费下载,直接集成到 SSMS 中:)
【讨论】:
这会搜索所有视图、过程和用户定义的函数:
CREATE PROCEDURE usp_SearchFor
@PatternIn AS varchar(max)
,@ObjectNamePattern AS varchar(max) = NULL
AS
BEGIN
DECLARE @Pattern AS varchar(max)
SET @Pattern = '%' + @PatternIn + '%' ;
WITH ROUTINES
AS (
-- CANNOT use INFORMATION_SCHEMA.ROUTINES because of 4000 character limit
SELECT o.type_desc AS ROUTINE_TYPE
,s.[name] AS [SCHEMA_NAME]
,o.[name] AS ROUTINE_NAME
,m.definition AS ROUTINE_DEFINITION
FROM sys.sql_modules AS m WITH (NOLOCK)
INNER JOIN sys.objects AS o WITH (NOLOCK)
ON m.[object_id] = o.[OBJECT_ID]
INNER JOIN sys.schemas AS s WITH (NOLOCK)
ON s.[schema_id] = o.[schema_id]
WHERE m.definition LIKE @Pattern
),
Results
AS (
SELECT ROUTINE_TYPE
,[SCHEMA_NAME]
,ROUTINE_NAME
,PATINDEX(@Pattern, ROUTINE_DEFINITION) AS StartPos
,SUBSTRING(ROUTINE_DEFINITION,
PATINDEX(@Pattern, ROUTINE_DEFINITION),
255) AS WorkItem
,RIGHT(ROUTINE_DEFINITION,
LEN(ROUTINE_DEFINITION) - PATINDEX(@Pattern, ROUTINE_DEFINITION)) AS Remainder
,1 AS Occurrence
FROM ROUTINES
UNION ALL
SELECT ROUTINE_TYPE
,[SCHEMA_NAME]
,ROUTINE_NAME
,PATINDEX(@Pattern, Remainder) AS StartPos
,SUBSTRING(Remainder, PATINDEX(@Pattern, Remainder),
255) AS WorkItem
,RIGHT(Remainder,
LEN(Remainder) - PATINDEX(@Pattern,
Remainder)) AS Remainder
,Occurrence + 1 AS Occurrence
FROM Results
WHERE PATINDEX(@Pattern, Remainder) > 0
)
SELECT 'Search For:' + @PatternIn AS Problem
,ROUTINE_TYPE
,QUOTENAME([SCHEMA_NAME]) + '.' + QUOTENAME([ROUTINE_NAME]) AS ROUTINE_NAME
,WorkItem
FROM Results
WHERE @ObjectNamePattern IS NULL
OR ROUTINE_NAME LIKE @ObjectNamePattern
ORDER BY ROUTINE_TYPE
,[SCHEMA_NAME]
,ROUTINE_NAME
,Occurrence
END
【讨论】:
存储的 proc 文本存储在 sysobjects、syscmets 中。
【讨论】:
只需将所有 proc 脚本写入一个查询窗口。然后 ctrl-f 让你心满意足。
【讨论】:
SELECT DISTINCT OBJECT_NAME(ID) FROM SysComments WHERE Text LIKE '%Search%'
显然已弃用,但在 SQL 2008 中仍然有效
【讨论】:
您可以使用下面的简单搜索
select ROUTINE_name from INFORMATION_SCHEMA.ROUTINES
where CHARINDEX('demo',routine_definition,1)>0
用你的任意字符串替换'demo'
【讨论】:
The multi-part identifier "dbo.procName" could not be bound.