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

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

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

8 ответов


один из вариантов-создать файл сценария.

щелкните правой кнопкой мыши по базе данных - > Задачи - > Создание Скриптов

затем вы можете выбрать все хранимые процедуры и создать сценарий со всеми СПС. Так что вы можете найти ссылку оттуда.

или

-- 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-найти столбец, используемый в хранимой процедуре-Поиск хранимой процедуры для имени столбца


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

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%';

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

enter image description here

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


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

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

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


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

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

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

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

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

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

Sample Result

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


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

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

у меня была та же проблема, и я обнаружил, что Microsoft есть systable это показывает зависимости.

SELECT 
    referenced_id
    , referenced_entity_name AS table_name
    , referenced_minor_name as column_name
    , is_all_columns_found
FROM sys.dm_sql_referenced_entities ('dbo.Proc1', 'OBJECT'); 

и это работает с Views и Triggers.


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