Просмотрите все базы данных на сервере, чтобы получить конкретные данные - PullRequest
0 голосов
/ 09 октября 2018

Можно ли написать скрипт, который проходит через каждый объект базы данных на сервере и получает конкретные данные, которые мне нужны?Это было бы что-то вроде - каждый объект, который содержит адрес или электронную почту

РЕДАКТИРОВАТЬ: мне в основном нужно найти объекты базы данных, которые содержат информацию о клиенте.Как можно найти все объекты, содержащие '@' (как в случае электронной почты)?

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Вы можете попробовать это:

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 '%@%');
0 голосов
/ 09 октября 2018

Вы можете использовать процедуру SQL sp_MSForEachTable в качестве опции. В справочном документе есть скрипт SQL, который возвращает все таблицы базы данных и их столбцы (просто в качестве примера)

Это такжеможно выполнить один и тот же сценарий для всех баз данных в одном и том же экземпляре SQL Server, используя sp_MSForEachDB, тоже

Но если вы ищете столбцы таблицы базы данных с таким именем, как адрес или адрес электронной почты, вы также можете использовать следующую инструкцию SQL Select

select 
    object_name(c.object_id) [object name], 
    o.type_desc [object type],
    c.name [column name] 
from sys.columns as c
inner join sys.objects as o
    on c.object_id = o.object_id
where c.name like '%address%' or c.name like '%email%'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...