У меня такой сценарий летает здесь. Вы можете использовать его для начала.
Он получает список интересных столбцов из каталога итераций по ним и запрашивает их, используя динамический SQL.
DECLARE @searched_value nvarchar(MAX) = 'a'; -- set to the value you search for
SET NOCOUNT ON;
DECLARE @schema_name sysname;
DECLARE @table_name sysname;
DECLARE @column_name sysname;
DECLARE @sql nvarchar(MAX);
DECLARE @result TABLE ([schema_name] sysname,
[table_name] sysname,
[column_name] sysname,
[value] nvarchar(MAX));
DECLARE cursor_all_columns CURSOR
LOCAL
FAST_FORWARD
FOR
SELECT s.name,
o.name,
c.name
FROM sys.schemas s
INNER JOIN sys.all_objects o
ON o.schema_id = s.schema_id
INNER JOIN sys.all_columns c
ON c.object_id = o.object_id
INNER JOIN sys.types y
ON y.user_type_id = c.user_type_id
WHERE o.type = 'U' -- set to 'V' for views
AND lower(y.name) IN ('char',
'nchar',
'varchar',
'nvarchar'); -- include more types if needed
OPEN cursor_all_columns;
FETCH NEXT FROM cursor_all_columns
INTO @schema_name,
@table_name,
@column_name;
WHILE @@fetch_status = 0
BEGIN
SET @sql = N'SELECT ''' + quotename(@schema_name) + N''',' + nchar(13) + nchar(10)
+ N' ''' + quotename(@table_name) + N''',' + nchar(13) + nchar(10)
+ N' ''' + quotename(@column_name) + N''',' + nchar(13) + nchar(10)
+ N' ' + quotename(@column_name) + N'' + nchar(13) + nchar(10)
+ N' FROM ' + quotename(@schema_name) + N'.' + quotename(@table_name) + N'' + nchar(13) + nchar(10)
+ N' WHERE lower(' + quotename(@column_name) + N') LIKE N''%' + lower(replace(replace(replace(@searched_value, '%', '!%'), '[', '!['), ']', '!]')) + N'%'' ESCAPE ''!'';' + nchar(13) + nchar(10);
INSERT INTO @result
EXEC sp_executesql @sql;
FETCH NEXT FROM cursor_all_columns
INTO @schema_name,
@table_name,
@column_name;
END;
CLOSE cursor_all_columns;
DEALLOCATE cursor_all_columns;
SELECT [schema_name],
[table_name],
[column_name],
[value]
FROM @result;
Is предназначен для таблиц, но он также должен работать для представлений, если вы измените тип объекта с 'U'
на 'V'
. (Хотя в любом случае таблицы могут быть более интересными.) Никаких гарантий.
Установите искомое значение в начале.
Поиск любого столбца типа (n)(var)char
, если он содержит искомое значение, без учета регистра. Если вы хотите, чтобы любые пользовательские типы были получены из строковых типов, вы должны соответствующим образом адаптировать их.
Выходными данными являются схема, имя таблицы (или представления), имя столбца и соответствующее значение (столбец может быть указан несколько раз, если в этом столбце искомое значение содержится в нескольких строках).
(Отказ от ответственности: может быть место для улучшений или ошибок.)