![]() |
Поиск в текстовых полях всей базы в Microsoft SQL ServerИсточник: gotdotnet
Недавно в организации, в которой я имею удовольствие работать, прошло мероприятие с нерусским названием - ребрендинг. Попросту - смена названия. Для того, чтобы убедиться, что в момент смены наименования клиенты получат на руки правильные документы, встал вопрос - а где же в нашей базе данных хранится наименование организации вообще? База данных существует уже больше 10 лет и гарантировать, что это название записано только в "правильных" справочниках не мог никто. Посему был написан небольшой скрипт, который искал вхождение наименования во все текстовые поля всех таблиц. 01.set concat_null_yields_null on02.declare03. @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 for09. select distinct c.TABLE_SCHEMA, c.TABLE_NAME10. from INFORMATION_SCHEMA.[COLUMNS] c11. where c.DATA_TYPE in('char', 'varchar', 'nvarchar', 'text')12. and c.CHARACTER_MAXIMUM_LENGTH >=413. and objectproperty(object_id(c.TABLE_SCHEMA + '.'+ c.TABLE_NAME), 'IsUserTable ') = 114. order by 1, 215.open curs16.while 1=117.begin18. 19. fetch next fr om curs into @schemaName, @tableName20. if @@FETCH_STATUS <> 0 break21. 22.-- Данную строку можно раскомментарить, если хочется видеть, в какой таблице идет поиск в данный момент 23.-- raiserror(';%s.%s', 10, 1, @schemaName, @tableName) with nowait24. 25. select26. @collist = null27. 28. select29. @collist = isnull(@collist + '30. or ', '') +'upper(convert(varchar(8000), ' + c.COLUMN_NAME + ')) like ''%ЛЮТИК%''' -- Тут указываем, что и как ищем 31. from INFORMATION_SCHEMA.[COLUMNS] c32. where c.TABLE_SCHEMA = @schemaName33. and c.TABLE_NAME = @tableName34. and c.DATA_TYPE in('char', 'varchar', 'nvarchar', 'text')35. and c.CHARACTER_MAXIMUM_LENGTH >=636. 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 sm3.where upper(sm.definition) like '%ЛЮТИК%' |