Найти все хранимые процедуры, которые ссылаются на определенный столбец в некоторой таблице
У меня есть значение в таблице, которая была неожиданно изменена. Соответствующий столбец CreatedDate
: это устанавливается, когда мой элемент создан, но он изменяется с помощью хранимой процедуры.
Могу ли я написать какой-либо тип оператора SELECT
, чтобы получить все имена процедур, которые ссылаются на этот столбец из моей таблицы?
Ответы
Ответ 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%'