Вы можете попробовать это:
CREATE TABLE #tbl(TableName VARCHAR(255),ColumnName VARCHAR(255))
DECLARE @SearchFor VARCHAR(100)='@'
- Используйте здесь разные фрагменты, вы можете использовать «улицу» или «дорогу» или что-нибудь еще
DECLARE @stmt VARCHAR(MAX);
DECLARE cur CURSOR FOR
SELECT
'INSERT INTO #tbl(TableName,ColumnName)
SELECT ''' + CONCAT(c.TABLE_SCHEMA,'.',c.TABLE_NAME) + ''',''' + c.COLUMN_NAME + '''
WHERE EXISTS(SELECT 1 FROM ' + CONCAT(QUOTENAME(c.TABLE_SCHEMA),'.',QUOTENAME(c.TABLE_NAME)) + ' WHERE ' + QUOTENAME(c.COLUMN_NAME) +' LIKE ''%' + @SearchFor +'%'');'
FROM INFORMATION_SCHEMA.COLUMNS c
WHERE c.DATA_TYPE LIKE '%char%';
OPEN cur;
FETCH NEXT FROM cur INTO @stmt;
EXEC(@stmt);
WHILE @@FETCH_STATUS=0
BEGIN
FETCH NEXT FROM cur INTO @stmt;
EXEC(@stmt);
END
CLOSE cur;
DEALLOCATE cur;
SELECT * FROM #tbl;
GO
DROP TABLE #tbl;
Один из редкихситуации, когда требуется CURSOR
.
Курсор будет содержать много операторов, построенных из INFORMATION_SCHEMA.COLUMNS
.Если имеется хотя бы одна строка со значением поиска, таблица и имя столбца добавляются в таблицу результатов.
Каждый оператор будет выглядеть примерно так:
INSERT INTO #tbl(TableName,ColumnName)
SELECT 'dbo.SomeTable','SomeColumn'
WHERE EXISTS(SELECT 1 FROM [dbo].[SomeTable] WHERE [SomeColumn] LIKE '%@%');