Запрос, чтобы узнать хранимую процедуру в зависимости от столбца - PullRequest
1 голос
/ 10 марта 2012

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

Ответы [ 5 ]

19 голосов
/ 10 марта 2012

Я использую этот запрос:

SELECT OBJECT_NAME(M.object_id), M.*
FROM sys.sql_modules M
JOIN sys.procedures P
ON M.object_id = P.object_id
WHERE M.definition LIKE '%blah%'

Очевидно, вам придется заменить «бла» на название вашей колонки.

4 голосов
/ 06 августа 2013

Попробуйте это 1 От Sp

SELECT Name as [Stored Procedure Name]
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%getdate%' order by Name

Из таблицы

SELECT t.name AS table_name,
SCHEMA_NAME(schema_id) AS schema_name,
c.name AS column_name
FROM sys.tables AS t
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
WHERE c.name LIKE '%EmployeeID%'
ORDER BY schema_name, table_name;
0 голосов
/ 04 апреля 2014

- Поиск по всем объектам

SELECT OBJECT_NAME (OBJECT_ID), определение FROM sys.sql_modules ГДЕ определение LIKE '%' + 'BusinessEntityID' + '%'

0 голосов
/ 04 апреля 2014

Поиск только в хранимых процедурах:

SELECT DISTINCT OBJECT_NAME(OBJECT_ID),
object_definition(OBJECT_ID)
FROM sys.Procedures
WHERE object_definition(OBJECT_ID) LIKE '%' + 'BusinessEntityID' + '%'
0 голосов
/ 01 октября 2013

Проблема:

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

Например, если у вас есть " CreatedDate ", на который ссылается " Person", и вы присоединитесь к таблице" Order"(которая также имеет поле" CreatedDate"), она найдет" false-positive »Соответствует« Order.CreatedDate », когда вы искали только« Person.CreatedDate ».

Поиск Text объектаК сожалению, лучший скрипт, который мы можем сделать на данный момент, - это скрипт для имен полей.
Хорошая новость заключается в том, что он не пропустит идентификацию полей, которые фактически используются.
Если что-нибудь из этого получит больше, чем было используется (из-за общих имен полей или закомментированного кода).
только Исключением будет динамический SQL, поскольку таблицы не связаны с объектными сценариями, если они встроены в динамическую строку.

Обходной путь:

CREATE FUNCTION [dbo].[ft_Schema_Column_Script]
(
    @ScriptName nVarChar(128) = '%',
    @TableName  nVarChar(128) = '%',
    @ColumnName nVarChar(128) = '%'
)
RETURNS TABLE
AS
RETURN
(
    SELECT @@SERVERNAME[ServerName], DB_NAME()[DatabaseName],
           SS.name[ScriptSchemaName], SO.name[ScriptName],
           SO.type_desc[ScriptType], 
           TS.name[TableSchemaName], T.name[TableName], C.name[ColumnName],
           UT.name[ColumnType], C.max_length[MaxLength],
           C.precision[NumericPrecision], C.scale[Scale],
           C.is_nullable[Nullable],
           C.is_identity[IsIdentity],
           C.column_id[Ordinal],
           EP.value[Description]
      FROM sys.sql_modules as M
      JOIN sys.objects     as SO--Script Object.
        ON M.object_id = SO.object_id
      JOIN sys.schemas as SS--Script Schema.
        ON SS.schema_id = SO.schema_id
      JOIN sys.sql_expression_dependencies D
        ON D.referencing_id = SO.object_id
      JOIN sys.tables as T
        ON T.object_id = D.referenced_id
      JOIN sys.schemas as TS--Table Schema.
        ON TS.schema_id = T.schema_id
      JOIN sys.columns as C
        ON C.object_id = T.object_id
      LEFT JOIN sys.types AS UT--Left Join because of user-defined/newer types.
        ON UT.user_type_id = C.user_type_id
      LEFT JOIN sys.extended_properties AS EP
        ON EP.major_id = C.object_id
       AND EP.minor_id = C.column_id
       AND EP.name = 'MS_Description'
     WHERE  T.name LIKE @TableName  ESCAPE '\'
       AND  C.name LIKE @ColumnName ESCAPE '\'
       AND SO.name LIKE @ScriptName ESCAPE '\'
       --Use RegEx to exclude false-posotives by from similar ColumnNames.
       --  (e.g. Ignore the "ModifiedBy" field when matching on "Modified").
       --  Use C.name instead of @ColumnName to further reduce false-positives.
       AND M.definition LIKE (  N'%[ ~`!@#$\%\^&*()+-=\[\]\\{}|;'''':",./<>?]'
                              + C.name
                              + N'[ ~`!@#$\%\^&*()+-=\[\]\\{}|;'''':",./<>?]%'
                             ) ESCAPE '\'
)
GO


Тест:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
   SELECT * FROM dbo.ft_Schema_Column_Script('ScriptName', DEFAULT, DEFAULT) as C
   SELECT * FROM dbo.ft_Schema_Column_Script(DEFAULT, 'TableName',  DEFAULT) as C
   SELECT * FROM dbo.ft_Schema_Column_Script(DEFAULT, DEFAULT, 'ColumnName') as C
SET TRANSACTION ISOLATION LEVEL READ COMMITTED

Проверьте приведенный выше пример, чтобы убедиться, что он достаточно хорош для удовлетворения ваших потребностей.

Результаты:

Пример вывода при запуске этой функции при поиске имени столбца " Created ".
Example of running the function searching for the Column Name

Поиск хранимых процедур (Sprocs), Пользователь-Defined-Functions (UDF), триггеры, но не Jobs .

Классная вещь:
Это не только поиск столбцов, на которые ссылаются скрипты,
но также скрипты, на которые ссылаются столбцы (или таблицы)!

...