2009-04-01 20 views

Répondre

3

Vous pourriez probablement le faire en utilisant SQL dynamique en utilisant sys.cols & sys.tables vous devriez être capable de créer la requête.

Il s'agira probablement d'une requête extrêmement longue.

Je repensée ma réponse et si vous exécutez la requête ci-dessous, il va générer un certain nombre d'instructions SQL, si vous exécutez ces déclarations, vous trouverez sur quelle colonne a la valeur souhaitée. Remplacez simplement [votre valeur ici] par la valeur appropriée. C'est en supposant que votre valeur est un varchar.

SELECT 'SELECT ''' + TABLE_NAME + '.' + column_name + 
    ''' FROM ' + TABLE_NAME + ' WHERE ' + 
    column_name + ' = ''[your value here]''' 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE DATA_TYPE = 'varchar'; 
+0

je suis ok avec une longue requête. Une fois que je l'ai trouvé, j'ai terminé et je n'aurai plus besoin de le relancer. – ajma

0

Vous ne pouvez pas avec SQL simple. Sauf si vous utilisez un outil qui fait cela (PL/SQL developer pour Oracle).

1

Vous ne pouvez pas le faire en une seule requête. Vous allez devoir parcourir les vues info sys.tables et sys.columns et construire plusieurs requêtes (une seule pour chaque table) qui chercheront dans tous les champs de votre valeur dans une construction OR très longue (une pour chaque champ).

0

Je risque d'être downvoted sur ce beau jour 1st april, mais je pense qu'il sera plus facile de grep le fichier de données dans ce cas.

0

La procédure stockée sp_msForEachTable exécute une requête pour chaque table. C'est la partie simple. Regarder dans toutes les colonnes de chaque table devrait être la partie la plus difficile. Au début, ils ont probablement différents types de données. Donc, vous serez probablement seulement capable d'effectuer une comparaison de chaînes.

Mais je suis sûr que cela est possible en utilisant les informations des tables système et certaines procédures système stockées. J'essaierais de trouver une solution pour accéder à une seule colonne sur une seule table où le nom de la table et le nom de la colonne ne sont donnés que comme paramètres de la chaîne. À ce stade, vient à l'esprit Dynamic SQL. Si vous résolviez cela, il deviendrait relativement simple d'obtenir tous les noms de tables avec tous les noms de colonnes des tables système et de les joindre tous ensemble ou de les placer dans une procédure stockée. Je voudrais voir le résultat si vous trouvez une solution.

1

Je l'ai écrit il y a quelques temps, je ne sais pas exactement ce que c'était. Je me souviens que c'était avant que je connaisse sp_msForEachTable! Vous pourriez avoir besoin d'ajuster les tailles variables (peut aussi bien les faire tous MAX si vous êtes en 2005 +)

create proc SearchForValues (@search varchar(100)) 

as 

Begin 

declare @i int 
declare @tbl varchar(50) 
declare @col varchar(50) 
declare @sql varchar(500) 


create table #TEMP (id int identity (1,1), colname varchar(50), tblname varchar(50)) 

insert into #TEMP 
select a.name, b.name from dbo.syscolumns a inner join 
(
select * from dbo.sysobjects where xtype = 'U' 
) b 
on a.ID = b.ID 

create table #SEARCHRESULT (TblName varchar(50), ColName varchar(50)) 


If isnumeric(@search) = 0 and @search is not null 
begin 
set @search = '''' + @search + '''' 
end 

set @i = 1 

While @i <= (select max(id) from #TEMP) 
    Begin 
    select @tbl = tblname from #temp where ID = @i 
    select @col = colname from #temp where ID = @i 

    set @sql = 'If Exists(select * 
          from [' + @tbl + '] 
          where convert(varchar(500), [' + @col + ']) = ' + @search + ' 
         ) 
        Insert Into #SEARCHRESULT (TblName, ColName) Values(''' + @tbl + ''',''' + @col + ''')' 

    execute (@sql) 

    set @i = @i + 1 
    End 

drop table #TEMP 
select * from #SEARCHRESULT 
drop table #SEARCHRESULT 
end 
Questions connexes