Kun je in een database in alle tabellen zoeken naar een bepaalde tekst?Lees mee hoe je dit met wat eenvoudige T-SQL statements kunt uitvoeren.
zoek in alle kolommen van alle tabellen naar een tekst
De kolommen van een tabel zijn in
sys.columns te vinden. Om alleen de user tabellen te vinden is een
selectie uit sys.tables voldoende. Aangezien we op een tekstfragment zoeken, hoeven we alleen die
kolommen te selecteren die tekst bevatten. Dit zijn de kolommen met als type TEXT, NTEXT, VARCHAR, CHAR, NVARCHAR en NCHAR.
Deze informatie is te vinden in de kolom sys.types. Ik gebruik de system_type_id kolom in de query.Het resultaat sla ik in een tijdelijke tabel op. In deze tijdelijke tabel sla ik ook nog de inhoud van de kolom op.
De code is als volgt:
set nocount on go declare @tablename sysname declare @columnname sysname declare @sqlcmd nvarchar(max) declare @zoekcriteria nvarchar(256) create table ##zoeklijst(tablename sysname, columnname sysname, inhoud nvarchar(max)) set @zoekcriteria = '%index%' declare c_lus cursor for select b.name, a.name from sys.columns a join sys.tables b on a.object_id = b.object_id where a.system_type_id in (35,99,167,175, 231,239) order by 1,2 open c_lus fetch next from c_lus into @tablename, @columnname while @@fetch_status = 0 begin set @sqlcmd = 'insert into ##zoeklijst select ' + quotename(@tablename, char(39)) + ','+ quotename(@columnname, char(39))+ ',' + quotename(@columnname) + ' from ' + quotename(@tablename) + ' where ' + quotename(@columnname) + ' like ' + quotename(@zoekcriteria, char(39)) print @sqlcmd exec(@sqlcmd) fetch next from c_lus into @tablename, @columnname end close c_lus deallocate c_lus select * from ##zoeklijst drop table ##zoeklijst