45 votes

Comment trouver une chaîne dans une base de données entière ?

J'ai une chaîne spécifique, telle que "123abcd" par exemple, mais je ne connais pas le nom de la table ni même le nom de la colonne à l'intérieur de la table sur ma base de données SQL Server. Je veux le trouver avec une sélection et afficher toutes les colonnes de la chaîne associée, alors je me demandais quelque chose comme :

 select * from Database.dbo.* where * like  '%123abcd%'

Pour des raisons évidentes, cela ne fonctionne pas, mais il existe un moyen simple de créer une instruction select pour faire quelque chose comme ça ?

4voto

DavidEG Points 2685

Je pense que vous avez des options:

  1. Construisez un SQL dynamique en utilisant sys.tables et sys.columns pour effectuer la recherche ( exemple ici ).

  2. Utilisez n'importe quel programme qui a cette fonction. Un exemple de ceci est SQL Workbench (gratuit).

4voto

create procedure usp_find_string(@string as varchar(1000))
as
begin
declare @mincounter as int
declare @maxcounter as int
declare @stmtquery as varchar(1000)
set @stmtquery=''
create table #tmp(tablename varchar(128),columnname varchar(128),rowid int identity)
create table #tablelist(tablename varchar(128),columnname varchar(128))
declare @tmp table(name varchar(128))
declare @tablename as varchar(128)
declare @columnname as varchar(128)

insert into #tmp(tablename,columnname)
select a.name,b.name as columnname from sysobjects a
inner join syscolumns b on a.name=object_name(b.id)
where a.type='u'
and b.xtype in(select xtype from systypes
    where name='text' or name='ntext' or name='varchar' or name='nvarchar' or name='char' or name='nchar')
order by a.name

select @maxcounter=max(rowid),@mincounter=min(rowid) from #tmp 
while(@mincounter <= @maxcounter )
begin
 select @tablename=tablename, @columnname=columnname from #tmp where rowid=@mincounter
 set @stmtquery ='select top 1  ' + '[' +@columnname+']' + ' from ' + '['+@tablename+']' + ' where ' + '['+@columnname+']' + ' like ' + '''%' + @string + '%'''
 insert into @tmp(name) exec(@stmtquery)
 if @@rowcount >0
 insert into #tablelist values(@tablename,@columnname)
 set @mincounter=@mincounter +1
end
select * from #tablelist
end

3voto

Raihan Points 2760

Dans Oracle, vous pouvez utiliser la commande SQL suivante pour générer les commandes SQL dont vous avez besoin :

 select 
     "select * "
     " from "||table_name||
     " where "||column_name||" like '%123abcd%' ;" as sql_command
from user_tab_columns
where data_type='VARCHAR2';

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X