Поиск в текстовых полях всей базы в Microsoft SQL ServerИсточник: gotdotnet
Недавно в организации, в которой я имею удовольствие работать, прошло мероприятие с нерусским названием - ребрендинг. Попросту - смена названия. Для того, чтобы убедиться, что в момент смены наименования клиенты получат на руки правильные документы, встал вопрос - а где же в нашей базе данных хранится наименование организации вообще? База данных существует уже больше 10 лет и гарантировать, что это название записано только в "правильных" справочниках не мог никто. Посему был написан небольшой скрипт, который искал вхождение наименования во все текстовые поля всех таблиц. 01. set concat_null_yields_null on 02. declare 03. @collist varchar ( max ), 04. @srch_sql varchar ( max ), 05. @schemaName varchar (128), 06. @tableName varchar (128) 07. 08. declare curs cursor local static forward_only for 09. select distinct c.TABLE_SCHEMA, c.TABLE_NAME 10. from INFORMATION_SCHEMA.[COLUMNS] c 11. where c.DATA_TYPE in ( 'char' , 'varchar' , 'nvarchar' , 'text' ) 12. and c.CHARACTER_MAXIMUM_LENGTH >=4 13. and objectproperty(object_id(c.TABLE_SCHEMA + '.' + c.TABLE_NAME), 'IsUserTable ' ) = 1 14. order by 1, 2 15. open curs 16. while 1=1 17. begin 18. 19. fetch next fr om curs into @schemaName, @tableName 20. if @@FETCH_STATUS <> 0 break 21. 22. -- Данную строку можно раскомментарить, если хочется видеть, в какой таблице идет поиск в данный момент 23. -- raiserror(';%s.%s', 10, 1, @schemaName, @tableName) with nowait 24. 25. select 26. @collist = null 27. 28. select 29. @collist = isnull (@collist + ' 30. or ' , '' ) + 'upper(convert(varchar(8000), ' + c.COLUMN_NAME + ')) like ' '%ЛЮТИК%' '' -- Тут указываем, что и как ищем 31. from INFORMATION_SCHEMA.[COLUMNS] c 32. where c.TABLE_SCHEMA = @schemaName 33. and c.TABLE_NAME = @tableName 34. and c.DATA_TYPE in ( 'char' , 'varchar' , 'nvarchar' , 'text' ) 35. and c.CHARACTER_MAXIMUM_LENGTH >=6 36. set @srch_sql = 'if exists(select * from ' +@schemaName+ '.' +@tableName+ ' with(nolock) where ' +@collist+ ') 37. raiserror(' '' +@schemaName+ '.' +@tableName+ ' - found!' ', 10, 1) with nowait' 38. 39. exec (@srch_sql) 40. end С поиском текста в хранимых процедурах - еще проще: 1. select object_schema_name(sm.object_id)+ '.' +object_name(sm.object_id), objectpropertyex(sm.[object_id], 'BaseType' ) 2. from sys.sql_modules sm 3. where upper (sm.definition) like '%ЛЮТИК%' |