Подтвердить что ты не робот

Найти все хранимые процедуры, которые ссылаются на определенный столбец в некоторой таблице

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

Могу ли я написать какой-либо тип оператора SELECT, чтобы получить все имена процедур, которые ссылаются на этот столбец из моей таблицы?

4b9b3361

Ответ 1

Один из вариантов - создать файл script.

Щелкните правой кнопкой мыши по базе данных → Задачи → Сгенерировать скрипты

Затем вы можете выбрать все хранимые процедуры и сгенерировать script со всеми sps. Итак, вы можете найти ссылку оттуда.

или

-- Search in All Objects
SELECT OBJECT_NAME(OBJECT_ID),
definition
FROM sys.sql_modules
WHERE definition LIKE '%' + 'CreatedDate' + '%'
GO

-- Search in Stored Procedure Only
SELECT DISTINCT OBJECT_NAME(OBJECT_ID),
object_definition(OBJECT_ID)
FROM sys.Procedures
WHERE object_definition(OBJECT_ID) LIKE '%' + 'CreatedDate' + '%'
GO

Источник SQL SERVER - Поиск столбца, используемого в хранимой процедуре - Поиск хранимой процедуры для имени столбца

Ответ 2

Вы можете использовать ApexSQL Search, это бесплатная SSMS и надстройка Visual Studio, и она может отображать все объекты, которые ссылаются на конкретный столбец таблицы, Он также может находить данные, хранящиеся в таблицах и представлениях. Вы можете легко отфильтровать результаты, чтобы показать конкретный тип объекта базы данных, который ссылается на столбец

enter image description here

Отказ от ответственности: я работаю для ApexSQL в качестве инженера поддержки

Ответ 3

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

SELECT DISTINCT Name
FROM sys.Procedures
WHERE object_definition(OBJECT_ID) LIKE '%CreatedDate%';

Если вы хотите получить хранимые процедуры с использованием определенного столбца таблицы, вы можете использовать следующий запрос:

SELECT DISTINCT Name 
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%tbl_name%'
AND OBJECT_DEFINITION(OBJECT_ID) LIKE '%CreatedDate%';

Ответ 4

попробуйте это.

SELECT Name
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%CreatedDate%'
GO

или вы можете сгенерировать скрипты всех процедур и поиска оттуда.

Ответ 5

Вы можете использовать системные представления, содержащиеся в information_schema, для поиска в таблицах, представления и ( незашифрованные) хранимые процедуры с одним script. Я разработал такой script некоторое время назад, потому что мне нужно было искать имена полей всюду в базе данных.

Ниже в списке script перечислены таблицы/представления, содержащие имя столбца, которое вы ищете, а затем исходный код хранимых процедур, в котором находится столбец. Он отображает результат в одной таблице, отличающий "BASE TABLE", "VIEW" и "PROCEDURE" и (необязательно) исходный код во второй таблице:

DECLARE @SearchFor nvarchar(max)='%CustomerID%' -- search for this string
DECLARE @SearchSP bit = 1 -- 1=search in SPs as well
DECLARE @DisplaySPSource bit = 1 -- 1=display SP source code

-- tables
if (@SearchSP=1) begin  
  (
  select '['+c.table_Schema+'].['+c.table_Name+'].['+c.column_name+']' [schema_object], 
            t.table_type 
  from information_schema.columns c
  left join information_schema.Tables t on c.table_name=t.table_name
  where column_name like @SearchFor 
  union
  select '['+routine_Schema+'].['+routine_Name+']' [schema_object], 
         'PROCEDURE' as table_type from information_schema.routines
  where routine_definition like @SearchFor
        and routine_type='procedure'
  )
  order by table_type, schema_object
end else begin
  select '['+c.table_Schema+'].['+c.table_Name+'].['+c.column_name+']' [schema_object], 
         t.table_type 
  from information_schema.columns c
  left join information_schema.Tables t on c.table_name=t.table_name
  where column_name like @SearchFor 
  order by c.table_Name, c.column_name
end     
-- stored procedure (source listing)
if (@SearchSP=1) begin      
    if (@DisplaySPSource=1) begin
      select '['+routine_Schema+'].['+routine_Name+']' [schema.sp], routine_definition 
      from information_schema.routines
      where routine_definition like @SearchFor
      and routine_type='procedure'
      order by routine_name
    end
end

Если вы запустите запрос, используйте параметр "результат как текст", затем вы можете использовать "find" для поиска текста поиска в наборе результатов (полезно для длинного исходного кода).

Примечание, которую вы можете установить @DisplaySPSource в 0, если хотите просто отобразить имена SP, и если вы просто ищете таблицы/представления, но не для SP, вы может установить @SearchSP в 0.

Результат результата (найдите CustomerID в базе данных Northwind, результаты отображаются через LinqPad):

Пример результата

Примечание, что я подтвердил этот script с тестовым представлением dbo.TestOrders и он нашел CustomerID в этом представлении, даже если c.* использовался в операторе SELECT (в таблице Customers содержится CustomerID и, следовательно, представление показывает этот столбец).

Ответ 6

Вы можете использовать приведенный ниже запрос для определения значений. Но имейте в виду, что это не даст вам результатов из зашифрованной хранимой процедуры.

SELECT DISTINCT OBJECT_NAME(comments.id) OBJECT_NAME
    ,objects.type_desc
FROM syscomments comments
    ,sys.objects objects
WHERE comments.id = objects.object_id
    AND TEXT LIKE '%CreatedDate%'
ORDER BY 1

Ответ 7

SELECT *
FROM   sys.all_sql_modules
WHERE  definition LIKE '%CreatedDate%'