SQL_scripts
/
поиск значения в таблицах.sql
100 строк · 2.7 Кб
1
2set nocount on
3
4declare
5@srch_like varchar(100) = '%search%' -- текст для поиска
6,@col_like varchar(max) = '%column%' -- пусто или перечень колонок в которых искать
7,@tbl_like varchar(max) = '%table%' -- пусто или перечень таблиц в которых искать
8,@row_cnt_less int = 150 -- искать в таблицах в которых количество строк <= значению
9
10
11select
12@srch_like = isnull(ltrim(rtrim(@srch_like)), '')
13,@col_like = isnull(ltrim(rtrim(@col_like)), '')
14,@tbl_like = isnull(ltrim(rtrim(@tbl_like)), '')
15
16if (ltrim(@srch_like) = '')
17throw 50000, '@srch_like не задан!', 1
18
19drop table if exists #t1
20
21select
22identity(int) as id
23,quotename(schema_name(t.schema_id)) + '.' + quotename(t.[name]) as Таблица
24,p.[rows] as Всего_строк
25,quotename(c.[name]) as Колонка
26--,tp.[name] as Тип
27,0 as Найдено
28into #t1
29from
30sys.tables as t (nolock)
31inner join sys.indexes as i (nolock)
32on i.object_id = t.object_id
33inner join sys.columns as c (nolock)
34on c.object_id = t.object_id
35inner join sys.types as tp
36on c.user_type_id = tp.user_type_id
37inner join (
38select
39object_id
40,index_id
41,sum([rows]) as [rows]
42from sys.partitions (nolock)
43group by
44object_id
45,index_id
46having (((@row_cnt_less > 0) and (sum([rows]) between 1 and @row_cnt_less)) or (@row_cnt_less < 1))
47) as p
48on p.object_id = i.object_id
49and p.index_id = i.index_id
50where 1=1
51and t.is_ms_shipped = 0
52and i.[type] in (0,1)
53and ((@tbl_like <> '' and t.[name] like @tbl_like) or (@tbl_like = ''))
54and ((@col_like <> '' and c.[name] like @col_like) or (@col_like = ''))
55and tp.[name] in ('text', 'ntext', 'varchar', 'char', 'nvarchar', 'nchar', 'sysname')
56order by t.[name]
57option (maxdop 8)
58
59declare
60@id int
61,@cnt int = 0
62,@query nvarchar(max) = ''
63,@max_id int = (select max(id) from #t1)
64
65declare curs cursor for
66select
67id
68,'select @cnt = count(*) from ' + Таблица + ' (nolock) where ' + Колонка + ' like ''' + @srch_like + ''''
69from #t1
70order by id
71open curs
72fetch next from curs into @id, @query
73while @@fetch_status = 0
74begin
75
76exec sys.sp_executesql
77@query
78,N'@cnt int out'
79,@cnt = @cnt out
80
81update #t1 set
82Найдено = @cnt
83where id = @id
84
85raiserror('[%d/%d]', 10, 1, @id, @max_id) with nowait
86
87fetch next from curs into @id, @query
88end
89close curs
90deallocate curs
91
92select
93db_name() as База
94,Таблица
95,Всего_строк
96,Колонка
97,Найдено
98--,'select ' + Колонка + ' from ' + Таблица + ' (nolock) where ' + Колонка + ' like ''' + @srch_like + '''' as Запрос
99from #t1
100where Найдено > 0
101order by 1,3
102
103
104