Technical Article

Search for an expression in the body of programmable objects

,

Sometimes you want to modify an object (like a stored procedure, Function, trigger
and view) and you can not

remember the name of that object, but you remember some
words of the comments that you placed in the body of that

object.

If this is your case, you can use the following procedures depending on what version of SQL Server you are using.
It will

search all the databases except system databases and if it finds any match, it will return the name and the type of that object.

By the way, this stored procedure is on its second edition.

Usage:

Consider you have the following comment in the body of your object:

"This is a test to test the efficiency of the stored proc!"

You can invoke the proc in the following ways:

Exec Usp_SearchInBodyOfCodes 'efficiency "This is a test" ', @flag='w'

It will search for the words "efficiency" and "This is a test" in the body of mentioned objects.

Exec Usp_SearchInBodyOfCodes 'efficiency "This is a test" ', @flag='a'

Will search for any word of "efficiency" or "This is a test" n the body of the objects

Consideration:

Best to view the results in Query Analyzer Results in Text (Control

+T)
you can limit the databases in which you want Have fun with it, and if you like it vote for it....

/*==============================================================
SQL SERVER 2000 version:
==============================================================*/
Create proc Usp_SearchInBodyOfCodes (@s varchar(400),
     @flag char(1))

as 

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

  Written By  : yousef ekhtiari
  Email         :y_ekhtiari@yahoo.com
  Create  Date  : 10 January 2006
  Modified Date :19 November 2006
  Description : Returns the name of   stored procedures,all kinds of functions
which contain whole or any part of  expression
in a string


  
USAGE:

@flag='a' means any part of  expression
@flag='w' whole  part of  expression

exec Usp_SearchInBodyOfCodes  @s='#tmp_result   "yousef  ekhtiari"    ',@flag='w'
exec Usp_SearchInBodyOfCodes  @s='#tmp_result   "yousef  ekhtiari"  lol  ',@flag='a'


********************************************************************/set nocount on
create table #Sarg   (s varchar(100)  )
declare 
@pos int,
@sSQL varchar(8000),
 @dbname as sysname,
@where as  varchar(8000),
@collation as varchar(200)

if @flag not in ('w','a')
begin
raiserror('Invalid use of @flag',16,1)
return
end
set @s=ltrim(ltrim(@s))+' '

while len(@s)>0
begin
if left(@s,1)='"'
begin
set  @pos=CHARINDEX('"',@s,2)
insert  #Sarg values( ltrim(replace( left(@s,CHARINDEX('"',@s,2) ) ,'"','')))

end 
else
begin
set  @pos=CHARINDEX(' ',@s,2)
insert  #Sarg values(  ltrim(left(@s,CHARINDEX(' ',@s,2))))

end
set @s=ltrim(stuff(@s,1,@pos ,''))

end
declare db cursor 
for  SELECT [name],convert(varchar(100),DATABASEPROPERTYEX([name], 'Collation') )
FROM [master].[dbo].[sysdatabases]
/*where sid<>0x01--excludes all system databases attention: I already thought the system databases have sid equal to 0x01 but I 

came across a user database with sid equal to 0x01
so I decided to alter the code*/where name not in('master','tempdb','msdb','distribution','model')
open db
fetch next from db into @dbname,@collation
while @@fetch_status=0
begin
print '----------------'+ @dbname+'------------------------'

set @sSQL='SELECT  distinct [name]=cast([name]as varchar(30)) ,type=case  type
                                            when  ''p'' then ''stored procedure''
                                            when  ''V'' then ''stored procedure''
                                            when  ''TR'' then ''trigger''
                                            when  ''TF'' then ''table-valued-function''
                                            when  ''IF'' then ''inlined table-valued function''
                                            when  ''FN'' then ''scalar function''
                                            end 
FROM  '+@dbname+'.[dbo].[sysobjects] o
inner join  '+@dbname+'.[dbo].[syscomments] c on o.id=c.id
where xtype in (''p'',''V'', ''TR'', ''TF'', ''IF'', ''FN '')
and name     not like ''dt_%'''
if @flag='a'
set @sSQL=@sSQL+' and   exists(
select * from #Sarg
where 
 ltrim(rtrim(text))    like N''%''+ltrim(rtrim(s))+''%''  COLLATE 

 '+@collation+')'
else if @flag='w'
begin
set @where=''

select @where=@where+' and  patindex( ''%'+replace(ltrim(rtrim(s)),'''','''''' )+'%'', text)>0'
from   #Sarg 

set @sSQL=@sSQL+@where

end


exec(@sSQL)
fetch next from db into @dbname,@collation

end
close db
deallocate db
drop table  #Sarg
/*==============================================================
SQL SERVER 2005 version:
==============================================================*/
Create proc Usp_SearchInBodyOfCodes (@s varchar(400),
                                     @flag char(1))

as 

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

  Written By                   : yousef ekhtiari
  Email                        :y_ekhtiari@yahoo.com
  Create  Date                 : 10 January 2006
  Modified for new SQL Version :19 November 2006
  Description : Returns the name of   stored procedures,all kinds of functions ,views and triggers
                which contain whole or any part of  expression
                in a string


  
USAGE:

@flag='a' means any part of  expression
@flag='w' whole  part of  expression

exec Usp_SearchInBodyOfCodes  @s='#tmp_result   "yousef  ekhtiari"    ',@flag='w'
exec Usp_SearchInBodyOfCodes  @s='#tmp_result   "yousef  ekhtiari"  lol  ',@flag='a'


********************************************************************/set nocount on
create table #Sarg   (s varchar(100)  )
declare 
        @pos int,
        @sSQL varchar(8000),
         @dbname as sysname,
        @where as  varchar(8000),
        @collation as varchar(200)

    if @flag not in ('w','a')
    begin
        raiserror('Invalid use of @flag',16,1)
        return
    end
set @s=ltrim(ltrim(@s))+' '

while len(@s)>0
begin
    if left(@s,1)='"'
        begin
            set  @pos=CHARINDEX('"',@s,2)
            insert  #Sarg values( ltrim(replace( left(@s,CHARINDEX('"',@s,2) ) ,'"','')))
    
        end 
    else
        begin
            set  @pos=CHARINDEX(' ',@s,2)
            insert  #Sarg values(  ltrim(left(@s,CHARINDEX(' ',@s,2))))
    
        end
    set @s=ltrim(stuff(@s,1,@pos ,''))

end
declare db cursor 
for  SELECT [name],convert(varchar(100),DATABASEPROPERTYEX([name], 'Collation') )
FROM sys.databases
where name not in('master','tempdb','msdb','distribution','model')
open db
fetch next from db into @dbname,@collation
while @@fetch_status=0
begin
    print '----------------'+ @dbname+'------------------------'

        set @sSQL='SELECT  distinct [name]=cast([name]as varchar(30))                                         ,type=case  type
                                            when  ''p'' then ''stored procedure''
                                            when  ''V'' then ''stored procedure''
                                            when  ''TR'' then ''trigger''
                                            when  ''TF'' then ''table-valued-function''
                                            when  ''IF'' then ''inlined table-valued function''
                                            when  ''FN'' then ''scalar function''
                                            end 
        FROM  '+@dbname+'.sys.objects o
        inner join  '+@dbname+'.sys.sql_modules c on o.object_id=c.object_id
        where type in (''p'',''V'', ''TR'', ''TF'', ''IF'', ''FN '')'
if @flag='a'
    set @sSQL=@sSQL+' and   exists(
                        select * from #Sarg
                        where   definition    like N''%''+ltrim(rtrim(s))+''%''  COLLATE  '+@collation+')'
else if @flag='w'
        begin
            set @where=''

            select @where=@where+' and  patindex( ''%'+replace(ltrim(rtrim(s)),'''','''''' )+'%'', definition)>0'
            from   #Sarg 
            
            set @sSQL=@sSQL+@where

        end

    
    exec(@sSQL)
fetch next from db into @dbname,@collation

end
close db
deallocate db
drop table  #Sarg

Rate

You rated this post out of 5. Change rating

Share

Share

Rate

You rated this post out of 5. Change rating