SQL Server 2008 - поиск конкретных команд / вызовов / текста - PullRequest
2 голосов
/ 14 января 2010

Мне нужно найти оператор вставки в конкретной таблице. К сожалению, приложение не мое с самого начала, в базе данных более 100 хранимых процедур, я прошел через код, записывая каждое имя хранимой процедуры от начала до конца этого процесса, и я до сих пор не могу его найти. Я знаю, что этот процесс должен произойти где-то, потому что другой процесс, который зависит от него, работает должным образом. Я просто не могу его найти.

Существует ли какой-то TSQL, который позволил бы мне выполнять поиск по нескольким хранимым процедурам для определенной строки текста ... более конкретно "INSERT INTO [tablename]"

UPDATE

Я пытался использовать:

 SELECT routine_name, routine_type  
 FROM INFORMATION_SCHEMA.ROUTINES  
 WHERE ROUTINE_DEFINITION LIKE '%INSERT INTO [tablename]%' 

Сразу же заменив [tablename] именем моей таблицы. Это возвращает 0 строк.

У меня действительно есть процедура с этой точной строкой, и я бы предположил, что она будет возвращена в вышеупомянутом запросе, но она вообще ничего не возвращает.

ОБНОВЛЕНИЕ № 2

После использования инструмента поиска redgate sql (используя INSERT INTO [имя_таблицы]) он возвращает 1 sp, но я все еще отрицаю, что это правильно из-за некоторого tsql (в конце sp его отбрасывающие таблицы которые все еще находятся в базе данных ...) (это где мой опыт в sql просвечивает)

Я до сих пор не могу найти, откуда это вызывается, хотя ...

ОБНОВЛЕНИЕ № 3

Я просто выполнил поиск по всему решению 'INSERT INTO [tablename]', чтобы выяснить, не использовали ли они хранимую процедуру для этого вызова, и ничего ... не нашел ее нигде.

Ответы [ 7 ]

5 голосов
/ 14 января 2010

Сделайте из этого хранимую процедуру!

GO

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO 

/*
exec sp_find_procs_containing 'insert into tablename'
*/

CREATE PROCEDURE [dbo].[sp_find_procs_containing]    
@search VARCHAR(100) = ''
AS
SET @search = '%' + @search + '%'
SELECT         ROUTINE_NAME,    ROUTINE_DEFINITION
FROM        
INFORMATION_SCHEMA.ROUTINES
WHERE        
ROUTINE_DEFINITION LIKE @search
ORDER BY ROUTINE_NAME

GO
2 голосов
/ 14 января 2010

Пока приложение запущено, попробуйте запустить Profiler для захвата выполненных запросов. Следующие события: SQL: BatchCompleted, RPC: Completed и SP: StmtCompleted.

Также обратите внимание, что слово "INTO" является необязательным для оператора INSERT, поэтому также ищите просто "INSERT [tablename]".

1 голос
/ 14 января 2010

Возможно, у вас есть LF, CR/LF с или лишние пробелы, которые мешают вашему поиску работать. Сокращайте строку поиска до тех пор, пока не получите совпадение (например, попробуйте просто использовать имя таблицы), или измените ее на: %INSERT%SOMETHING%INTO%SOMETHING% и т. Д.

1 голос
/ 14 января 2010

Посмотрите на этот инструмент red-gate: sql search Все еще в бета-версии, но он должен работать

1 голос
/ 14 января 2010

Просто, чтобы добавить к предыдущим ответам, которые я не буду повторять, я думаю, что это хорошая идея, чтобы все объекты базы данных были скриптовыми (и хранились в системе контроля версий). Поэтому я бы добавил, что вы убиваете 2 зайцев одним выстрелом - создайте сценарий для базы данных, а затем выполните поиск по созданным сценариям sql.

1 голос
/ 14 января 2010

Попробуйте

SELECT * FROM sys.syscomments
WHERE text LIKE '%CREATE PROCEDURE%'
AND text LIKE '%INSERT INTO%'

или

SELECT ROUTINE_NAME, ROUTINE_DEFINITION 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_DEFINITION LIKE '%INSERT INTO%' 
AND ROUTINE_TYPE='PROCEDURE'

2-й найден здесь

1 голос
/ 14 января 2010
 SELECT routine_name, routine_type 
 FROM INFORMATION_SCHEMA.ROUTINES 
 WHERE ROUTINE_DEFINITION LIKE '%INSERT INTO [tablename]%'

предупреждение: это может занять некоторое время.Если ваша система интенсивно используется, не запускайте ее по всей таблице, но добавьте некоторые дополнительные условия для поиска только нескольких сохраненных подпрограмм за раз

РЕДАКТИРОВАТЬ:

ВозможноВы должны попробовать что-то еще.Создайте текстовый дамп всех подпрограмм и используйте grep для поиска.Я уверен, что вы можете получить grep для Windows .Дампинг легко выполняется с помощью студии управления: перейдите к базе данных, щелкните правой кнопкой мыши и выберите задачи> создать сценарии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...