Поздний ответ, но так как я просто должен был что-то придумать для себя, здесь идет.Я написал следующее, чтобы найти во всех столбцах всех таблиц совпадение строк.Это связано с задачей анализа данных, которая была дана мне, чтобы найти все совпадения строк в базе данных весом около 24 ГБ.При таком размере вы можете себе представить, что использование курсоров или однопоточных запросов будет довольно медленным, а поиск по всей базе данных займет много времени.Я написал следующую хранимую процедуру CLR, чтобы выполнить работу для меня на стороне сервера и вернуть результаты в XML, в то же время форсируя распараллеливание.Это впечатляюще быстро.Поиск по всей базе данных в стандартной базе данных AdventureWorks2017 выполняется менее чем за 2 секунды.Наслаждайтесь!
Примеры использования:
Использование всех доступных процессоров на сервере:
EXEC [dbo].[SearchAllTables] @valueSearchTerm = 'john michael'
Ограничение сервера до 4 одновременных потоков:
EXEC [dbo].[SearchAllTables] @valueSearchTerm = 'john michael', @maxDegreeOfParallelism = 4
Использование логических операторов в терминах поиска:
EXEC [dbo].[SearchAllTables] @valueSearchTerm = '(john or michael) and not jack', @tablesSearchTerm = 'not contact'
Ограничение поиска именами таблиц и / или имен столбцов, содержащих некоторые условия поиска:
EXEC [dbo].[SearchAllTables] @valueSearchTerm = 'john michael', @tablesSearchTerm = 'person contact', @columnsSearchTerm = 'address name'
Ограничение результатов поиска первой строкой каждой таблицы, в которой найдены термины:
EXEC [dbo].[SearchAllTables] @valueSearchTerm = 'john michael', @getOnlyFirstRowPerTable = 1
Ограничение поиска только схемой автоматически возвращает только первую строку для каждой таблицы:
EXEC [dbo].[SearchAllTables] @tablesSearchTerm = 'person contact'
Возвращать только поисковые запросы:
EXEC [dbo].[SearchAllTables] @valueSearchTerm = 'john michael', @tablesSearchTerm = 'person contact', @onlyOutputQueries = 1
Захват результатов во временную таблицу и сортировка:
CREATE TABLE #temp (Result NVARCHAR(MAX));
INSERT INTO #temp
EXEC [dbo].[SearchAllTables] @valueSearchTerm = 'john';
SELECT * FROM #temp ORDER BY Result ASC;
DROP TABLE #temp;