Dha*_*tel 750 sql sql-server stored-procedures
我想从我的所有数据库存储过程中搜索文本.我使用下面的SQL:
SELECT DISTINCT
o.name AS Object_Name,
o.type_desc
FROM sys.sql_modules m
INNER JOIN
sys.objects o
ON m.object_id = o.object_id
WHERE m.definition Like '%[ABD]%';
Run Code Online (Sandbox Code Playgroud)
我想[ABD]
在所有存储过程中搜索包括方括号,但它没有给出正确的结果.如何更改查询以实现此目的?
Mah*_*mal 536
逃避方括号:
...
WHERE m.definition Like '%\[ABD\]%' ESCAPE '\'
Run Code Online (Sandbox Code Playgroud)
然后方括号将被视为字符串文字而不是通配符.
小智 301
试试这个请求:
询问
SELECT name
FROM sys.procedures
WHERE Object_definition(object_id) LIKE '%strHell%'
Run Code Online (Sandbox Code Playgroud)
Dan*_*ley 33
我通常运行以下操作来实现:
select distinct object_name(id)
from syscomments
where text like '%[ABD]%'
order by object_name(id)
Run Code Online (Sandbox Code Playgroud)
ped*_*ram 23
使用SQL Server的好习惯.
制作以下商店程序并为底部图像设置短按键,
CREATE PROCEDURE [dbo].[Searchinall]
(@strFind AS VARCHAR(MAX))
AS
BEGIN
SET NOCOUNT ON;
--TO FIND STRING IN ALL PROCEDURES
BEGIN
SELECT OBJECT_NAME(OBJECT_ID) SP_Name
,OBJECT_DEFINITION(OBJECT_ID) SP_Definition
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%'+@strFind+'%'
END
--TO FIND STRING IN ALL VIEWS
BEGIN
SELECT OBJECT_NAME(OBJECT_ID) View_Name
,OBJECT_DEFINITION(OBJECT_ID) View_Definition
FROM sys.views
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%'+@strFind+'%'
END
--TO FIND STRING IN ALL FUNCTION
BEGIN
SELECT ROUTINE_NAME Function_Name
,ROUTINE_DEFINITION Function_definition
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_DEFINITION LIKE '%'+@strFind+'%'
AND ROUTINE_TYPE = 'FUNCTION'
ORDER BY
ROUTINE_NAME
END
--TO FIND STRING IN ALL TABLES OF DATABASE.
BEGIN
SELECT t.name AS Table_Name
,c.name AS COLUMN_NAME
FROM sys.tables AS t
INNER JOIN sys.columns c
ON t.OBJECT_ID = c.OBJECT_ID
WHERE c.name LIKE '%'+@strFind+'%'
ORDER BY
Table_Name
END
END
Run Code Online (Sandbox Code Playgroud)
现在 - 设置如下所示的快捷键,
只要你想找到任何类似的四个对象的特定文本,以便下一次Store procedure
,Views
,Functions
和Tables
.您只需要编写该关键字并按下快捷键即可.
例如:我想搜索'PaymentTable'然后在查询编辑器中写'PaymentTable'并按下快捷键ctrl+4
- 它将为您提供完整的结果.
Mil*_*lan 18
请把它作为一个"肮脏"的替代方案,但这特别是当我不熟悉数据库项目时,这使我多次失败.有时您试图在所有SP中搜索字符串并忘记某些相关逻辑可能隐藏在函数和触发器之间或者它的操作步骤可能与你想象的不同.
在MSSMS中,您可以右键单击数据库并选择
Tasks -> Generate Scripts
向导,将所有SP,Fns和触发器输出到单个.sql文件中.
一定要选择触发器!
然后只需使用Sublime或Notepad搜索您需要查找的字符串.我知道这可能是非常低效和偏执的方法,但它的工作:)
小智 12
你也可以用这个:
SELECT *
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_DEFINITION like '%Search_String%'
Run Code Online (Sandbox Code Playgroud)
它可能对你有所帮助!
SELECT DISTINCT
A.NAME AS OBJECT_NAME,
A.TYPE_DESC
FROM SYS.SQL_MODULES M
INNER JOIN SYS.OBJECTS A ON M.OBJECT_ID = A.OBJECT_ID
WHERE M.DEFINITION LIKE '%['+@SEARCH_TEXT+']%'
ORDER BY TYPE_DESC
Run Code Online (Sandbox Code Playgroud)
小智 8
SELECT name , type_desc , create_date , modify_date
FROM sys.procedures
WHERE Object_definition(object_id) LIKE '%High%'
Run Code Online (Sandbox Code Playgroud)
select top 10 * from
sys.procedures
where object_definition(object_id) like '%\[ABD\]%'
Run Code Online (Sandbox Code Playgroud)
小智 6
SELECT DISTINCT
o.name AS Object_Name,
o.type_desc
FROM sys.sql_modules m INNER JOIN sys.objects o
ON m.object_id = o.object_id WHERE m.definition Like '%[String]%';
Run Code Online (Sandbox Code Playgroud)
小智 5
您也可以使用:
SELECT OBJECT_NAME(id)
FROM syscomments
WHERE [text] LIKE '%flags.%'
AND OBJECTPROPERTY(id, 'IsProcedure') = 1
GROUP BY OBJECT_NAME(id)
Run Code Online (Sandbox Code Playgroud)
那包括评论
SELECT DISTINCT OBJECT_NAME([id]),[text]
FROM syscomments
WHERE [id] IN (SELECT [id] FROM sysobjects WHERE xtype IN
('TF','FN','V','P') AND status >= 0) AND
([text] LIKE '%text to be search%' )
Run Code Online (Sandbox Code Playgroud)
OBJECT_NAME([id]) --> 对象名称(视图、存储过程、标量函数、表函数名称)
id (int) = 对象标识号
xtype char(2) 对象类型。可以是以下对象类型之一:
FN = 标量函数
P = 存储过程
V = 视图
TF = 表函数
我创建了一个过程来搜索过程/函数、表、视图或作业中的文本。第一个参数@search是搜索条件,@target是搜索目标,即程序、表格等。如果不指定,则搜索全部。@db是指定要搜索的数据库,默认为你当前的数据库。这是我的动态 SQL 查询。
ALTER PROCEDURE [dbo].[usp_find_objects]
(
@search VARCHAR(255),
@target VARCHAR(255) = NULL,
@db VARCHAR(35) = NULL
)
AS
SET NOCOUNT ON;
DECLARE @TSQL NVARCHAR(MAX), @USEDB NVARCHAR(50)
IF @db <> '' SET @USEDB = 'USE ' + @db
ELSE SET @USEDB = ''
IF @target IS NULL SET @target = ''
SET @TSQL = @USEDB + '
DECLARE @search VARCHAR(128)
DECLARE @target VARCHAR(128)
SET @search = ''%' + @search + '%''
SET @target = ''' + @target + '''
IF @target LIKE ''%Procedure%'' BEGIN
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 IN (''P'',''FN'')
GROUP BY o.name
ORDER BY o.name
END
ELSE IF @target LIKE ''%View%'' BEGIN
SELECT o.name As ''Views''
FROM SYSOBJECTS o
INNER JOIN SYSCOMMENTS c ON o.id = c.id
WHERE c.text LIKE @search
AND o.xtype = ''V''
GROUP BY o.name
ORDER BY o.name
END
/* Table - search table name only, need to add column name */
ELSE IF @target LIKE ''%Table%'' BEGIN
SELECT t.name AS ''TableName''
FROM sys.columns c
JOIN sys.tables t ON c.object_id = t.object_id
WHERE c.name LIKE @search
ORDER BY TableName
END
ELSE IF @target LIKE ''%Job%'' BEGIN
SELECT j.job_id,
s.srvname,
j.name,
js.step_id,
js.command,
j.enabled
FROM [msdb].dbo.sysjobs j
JOIN [msdb].dbo.sysjobsteps js
ON js.job_id = j.job_id
JOIN master.dbo.sysservers s
ON s.srvid = j.originating_server_id
WHERE js.command LIKE @search
END
ELSE BEGIN
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 IN (''P'',''FN'')
GROUP BY o.name
ORDER BY o.name
SELECT o.name As ''Views''
FROM SYSOBJECTS o
INNER JOIN SYSCOMMENTS c ON o.id = c.id
WHERE c.text LIKE @search
AND o.xtype = ''V''
GROUP BY o.name
ORDER BY o.name
SELECT t.name AS ''Tables''
FROM sys.columns c
JOIN sys.tables t ON c.object_id = t.object_id
WHERE c.name LIKE @search
ORDER BY Tables
SELECT j.name AS ''Jobs''
FROM [msdb].dbo.sysjobs j
JOIN [msdb].dbo.sysjobsteps js
ON js.job_id = j.job_id
JOIN master.dbo.sysservers s
ON s.srvid = j.originating_server_id
WHERE js.command LIKE @search
END
'
EXECUTE sp_executesql @TSQL
Run Code Online (Sandbox Code Playgroud)
更新: 如果您重命名了一个过程,它只会更新
sysobjects
,但不会更新syscomments
,这会保留旧名称,因此该过程将不会包含在搜索结果中,除非您删除并重新创建该过程。