Найти все хранимые процедуры, ссылающиеся на определенный столбец в некоторой таблице
у меня есть значение в таблице, был неожиданно изменен. Столбец в вопрос 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
Если вы хотите получить хранимые процедуры, используя только определенный столбец, вы можете использовать этот запрос:
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, и она может отображать все объекты, ссылающиеся на определенный столбец таблицы. Он также может найти данные, хранящиеся в таблицах и представлениях. Вы можете легко фильтровать результаты, чтобы показать определенный тип объекта базы данных, который ссылается на столбец
отказ от ответственности: я работаю в 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):
Примечание что я проверил этот скрипт с помощью тестового представления 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
.