How to find a text inside SQL Server procedures / triggers?

后端 未结 14 760
一个人的身影
一个人的身影 2020-12-04 04:48

I have a linkedserver that will change. Some procedures call the linked server like this: [10.10.100.50].dbo.SPROCEDURE_EXAMPLE. We have triggers also doing thi

相关标签:
14条回答
  • 2020-12-04 05:15

    I use this one for work. leave off the []'s though in the @TEXT field, seems to want to return everything...

    SET NOCOUNT ON
    
    DECLARE @TEXT   VARCHAR(250)
    DECLARE @SQL    VARCHAR(250)
    
    SELECT  @TEXT='10.10.100.50'
    
    CREATE TABLE #results (db VARCHAR(64), objectname VARCHAR(100),xtype VARCHAR(10), definition TEXT)
    
    SELECT @TEXT as 'Search String'
    DECLARE #databases CURSOR FOR SELECT NAME FROM master..sysdatabases where dbid>4
        DECLARE @c_dbname varchar(64)   
        OPEN #databases
        FETCH #databases INTO @c_dbname   
        WHILE @@FETCH_STATUS  -1
        BEGIN
            SELECT @SQL = 'INSERT INTO #results '
            SELECT @SQL = @SQL + 'SELECT ''' + @c_dbname + ''' AS db, o.name,o.xtype,m.definition '   
            SELECT @SQL = @SQL + ' FROM '+@c_dbname+'.sys.sql_modules m '   
            SELECT @SQL = @SQL + ' INNER JOIN '+@c_dbname+'..sysobjects o ON m.object_id=o.id'   
            SELECT @SQL = @SQL + ' WHERE [definition] LIKE ''%'+@TEXT+'%'''   
            EXEC(@SQL)
            FETCH #databases INTO @c_dbname
        END
        CLOSE #databases
    DEALLOCATE #databases
    
    SELECT * FROM #results order by db, xtype, objectname
    DROP TABLE #results
    
    0 讨论(0)
  • 2020-12-04 05:16

    Any searching with select statement yield you only object name, where search keyword contains. Easiest and efficient way is get script of procedure/function and then search in generated text file, I also follows this technique :) So you are exact pinpoint.

    0 讨论(0)
  • 2020-12-04 05:19

    You can find it like

    SELECT DISTINCT OBJECT_NAME(id) FROM syscomments WHERE [text] LIKE '%User%'
    

    It will list distinct stored procedure names that contain text like 'User' inside stored procedure. More info

    0 讨论(0)
  • 2020-12-04 05:21

    This will work for you:

    use [ANALYTICS]  ---> put your DB name here
    GO
    SELECT sm.object_id, OBJECT_NAME(sm.object_id) AS object_name, o.type, o.type_desc, sm.definition
    FROM sys.sql_modules AS sm
    JOIN sys.objects AS o ON sm.object_id = o.object_id
    where sm.definition like '%SEARCH_WORD_HERE%' collate SQL_Latin1_General_CP1_CI_AS
    ORDER BY o.type;
    GO
    
    0 讨论(0)
  • 2020-12-04 05:27

    This one i tried in SQL2008, which can search from all the db at one go.

    Create table #temp1 
    (ServerName varchar(64), dbname varchar(64)
    ,spName varchar(128),ObjectType varchar(32), SearchString varchar(64))
    
    Declare @dbid smallint, @dbname varchar(64), @longstr varchar(5000)
    Declare @searhString VARCHAR(250)
    
    set  @searhString='firstweek'
    
    declare db_cursor cursor for 
    select dbid, [name] 
    from master..sysdatabases
    where [name] not in ('master', 'model', 'msdb', 'tempdb', 'northwind', 'pubs')
    
    
    
    open db_cursor
    fetch next from db_cursor into @dbid, @dbname
    
    while (@@fetch_status = 0)
    begin
        PRINT 'DB='+@dbname
        set @longstr = 'Use ' + @dbname + char(13) +        
            'insert into #temp1 ' + char(13) +  
            'SELECT @@ServerName,  ''' + @dbname + ''', Name 
            , case  when [Type]= ''P'' Then ''Procedure''
                    when[Type]= ''V'' Then ''View''
                    when [Type]=  ''TF'' Then ''Table-Valued Function'' 
                    when [Type]=  ''FN'' Then ''Function'' 
                    when [Type]=  ''TR'' Then ''Trigger'' 
                    else [Type]/*''Others''*/
                    end 
            , '''+ @searhString +''' FROM  [SYS].[SYSCOMMEnTS]
            JOIN  [SYS].objects ON ID = object_id
            WHERE TEXT LIKE ''%' + @searhString + '%'''
    
     exec (@longstr)
     fetch next from db_cursor into @dbid, @dbname
    end
    
    close db_cursor
    deallocate db_cursor
    select * from #temp1
    Drop table #temp1
    
    0 讨论(0)
  • 2020-12-04 05:28

    [Late answer but hopefully usefull]

    Using system tables doesn't always give 100% correct results because there might be a possibility that some stored procedures and/or views are encrypted in which case you'll need to use DAC connection to get the data you need.

    I'd recommend using a third party tool such as ApexSQL Search that can deal with encrypted objects easily.

    Syscomments system table will give null value for text column in case object is encrypted.

    0 讨论(0)
提交回复
热议问题