Как найти текст внутри процедур / триггеров SQL Server? - PullRequest
165 голосов
/ 23 марта 2009

У меня есть связанный сервер, который изменится. Некоторые процедуры вызывают связанный сервер следующим образом: [10.10.100.50].dbo.SPROCEDURE_EXAMPLE. У нас есть триггеры, которые также выполняют эту работу. Нам нужно найти все места, которые используют [10.10.100.50], чтобы изменить его.

В SQL Server Management Studio Express я не нашел функции, подобной «найти во всей базе данных», в Visual Studio. Может ли специальный sys-select помочь мне найти то, что мне нужно?

Ответы [ 14 ]

0 голосов
/ 22 марта 2016

Вы можете искать в определениях всех объектов базы данных, используя следующий SQL:

SELECT 
    o.name, 
    o.id, 
    c.text,
    o.type
FROM 
    sysobjects o 
RIGHT JOIN syscomments c 
    ON o.id = c.id 
WHERE 
    c.text like '%text_to_find%'
0 голосов
/ 04 декабря 2015

Любой поиск с оператором select дает вам только имя объекта, в котором содержится ключевое слово для поиска. Самый простой и эффективный способ - получить сценарий процедуры / функции, а затем выполнить поиск в сгенерированном текстовом файле, я также следую этой методике :) Так что вы точно знаете.

0 голосов
/ 23 марта 2009

Я использовал это в прошлом:

В этом конкретном случае, когда вам нужно заменить определенную строку в хранимых процедурах, первая ссылка, вероятно, более актуальна.

Немного не по теме, надстройка Quick Find также полезна для поиска имен объектов в SQL Server Management Studio. Существует модифицированная версия , доступная с некоторыми улучшениями, и другая более новая версия также доступна в Codeplex с некоторыми другими полезными надстройками.

0 голосов
/ 23 марта 2009

Я использую это для работы. оставьте [] в поле @TEXT, похоже, хотите вернуть все ...

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
...