use master
go
-- =============================================
-- Description: Search a text in stored procedure source code.
-- @text - any text to find, search is done by like '%text%'
-- @dbname - database where to search, 
--         - if omitted, all databases in the SQL server instance
-- =============================================
alter PROCEDURE [dbo].[sp_FindTextInsideProcedure]
  @text varchar(250),
  @dbname varchar(64) = null ,
  @OrderByColumn int = 1 ,
  @Level int = null
AS BEGIN
SET NOCOUNT ON;
if ( @dbname is null or @dbname like '%[_]%' or @dbname like '%[%]%' ) and @Level is null
  begin
  /*
   -- cursor programming
    --enumerate all databases.
  DECLARE #db CURSOR FOR Select Name from master..sysdatabases where ( @dbname is null or Name like @dbname   )
  declare @c_dbname varchar(64)
  OPEN #db FETCH #db INTO @c_dbname
  while @@FETCH_STATUS <> -1 --and @MyCount < 500
   begin
     execute sp_FindTextInsideProcedure @text=@text, @dbname = @c_dbname
     FETCH #db INTO @c_dbname
   end  
  CLOSE #db DEALLOCATE #db
  */
      -- no cursor
      --enumerate all databases.
      Select Name 
      into #db
      from master..sysdatabases 
      where ( @dbname is null or Name like @dbname   )
      declare @c_dbname varchar(64)
      set @c_dbname = (select top 1 Name from #db)
      declare @result table ( db varchar(64) , name varchar(256) , [definition] nvarchar(max))
      while ( @c_dbname is not null )
      begin
            insert into @result 
            execute sp_FindTextInsideProcedure @text=@text, @dbname = @c_dbname , @Level =1
            delete #db
            where name = @c_dbname 
            -- get the next database name
            set @c_dbname = (select top 1 Name from #db)
      end  
      drop table #db
      select * from @result r
      order by case @OrderByColumn 
                              when 1 then r.db 
                              when 2 then r.name  
                              when 3 then r.[definition]  
                              else  r.db 
                  end
end --if @dbname is null
else
begin --@dbname is not null
  declare @sql varchar(4000)
  --create the find like command
  select @sql = 'select ''' + @dbname + ''' as db, o.name,m.definition '
                        + ' from ['+@dbname+'].sys.sql_modules m '
                        + ' inner join ['+@dbname+']..sysobjects o '
                        + '         on m.object_id=o.id'
                        + ' where [definition] like ''%'+@text+'%'''
  if (@Level is null)
  begin
      select @sql = @sql + 'order by case ' + convert(varchar , @OrderByColumn )  
                        + '                     when 1 then ''' + @dbname + ''''
                        + '                     when 2 then  o.name  '
                        + '                     when 3 then m.definition  '
                        + '                     else   ''' + @dbname + ''''
                        + '         end'
  end
  execute (@sql)
end --@dbname is not null
END