Пошук в текстових полях всієї бази в Microsoft SQL Server

Нещодавно в організації, в якій я маю задоволення працювати, пройшов захід з неросійських назвою – ребрендинг. Простіше – зміна назви.


Для того, щоб переконатися, що в момент зміни найменування клієнти отримають на руки правильні документи, постало питання – а де ж у нашій базі даних зберігається найменування організації взагалі?


База даних існує вже більше 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 "% Лютик%"

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*