Написал хранимую процедуру, которая ищет любые данные любого типа. Искомое значение и тип данных передаётся в параметрах.
Думаю кому-то будет полезно. Проверял работоспособность в MS SQL 2008 R2 и в 2016 версии. Думаю проблем с другими версиями не будет, возможно только если с самыми древними.
Код процедуры:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
-- Blog: https://progtask.ru CREATE PROCEDURE FindData (@Request NVARCHAR(36), @DataType NVARCHAR(20)) AS BEGIN IF OBJECT_ID('temp_db..#ResultsData') IS NOT NULL DROP TABLE #ResultsData CREATE TABLE #ResultsData ( TableType SYSNAME, TableSchema SYSNAME, TableName SYSNAME, TableColumn SYSNAME ); DECLARE @ExecQuery NVARCHAR(MAX); WITH QueriesAll(SQL) AS ( SELECT N'INSERT INTO #ResultsData (TableType, TableSchema, TableName, TableColumn)' + N' SELECT TOP(1) ''' + t.TABLE_TYPE + ''', ''' + t.TABLE_SCHEMA + ''', ''' + t.TABLE_NAME + ''', ''' + c.COLUMN_NAME + N'''' + N' FROM ' + QUOTENAME(t.TABLE_SCHEMA) + '.' + QUOTENAME(t.TABLE_NAME) + '' + N' WHERE ' + QUOTENAME(c.COLUMN_NAME) + ' = ''' + @Request + '''' AS Query FROM INFORMATION_SCHEMA.TABLES t INNER JOIN INFORMATION_SCHEMA.COLUMNS c ON t.TABLE_NAME = c.TABLE_NAME AND t.TABLE_SCHEMA = c.TABLE_SCHEMA WHERE c.DATA_TYPE = @DataType ) SELECT @ExecQuery = (SELECT [SQL]+NCHAR(10) FROM QueriesAll FOR XML PATH('')); EXEC sp_executesql @ExecQuery; SELECT * FROM #ResultsData; END |
Примеры использования:
1 |
FindData 'Hello', 'VARCHAR' |
1 |
FindData 'B92912D7-205D-4C39-8F8E-5BC10ABE2276', 'UNIQUEIDENTIFIER' |
Я думаю принцип понятен.
Надеюсь пригодится.