Проблема:
Как вы знаете, нет способа запросить, на какие поля ссылается функция или хранимая процедура.
Самое близкое, что мы можем получить - это приближение.
Мы можем сказать, на какие таблицы ссылаются и на какие поля могут ссылаться эти таблицы.
Например, если у вас есть " 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 ".
Поиск хранимых процедур (Sprocs), Пользователь-Defined-Functions (UDF), триггеры, но не Jobs .
Классная вещь:
Это не только поиск столбцов, на которые ссылаются скрипты,
но также скрипты, на которые ссылаются столбцы (или таблицы)!