2009-10-09 6 views
1

Est-ce que quelqu'un a une bonne méthode pour rechercher une base de données entière pour une valeur donnée? J'ai une chaîne spécifique que je cherche, c'est dans TableA, et c'est aussi un FK à une autre table, TableB, sauf que je ne sais pas quelle table/colonne c'est.SQL Super Search

En supposant qu'il y ait des tableaux jillion et que je ne veuille pas les parcourir tous, et que je devrais peut-être faire cela dans plusieurs cas différents, quelle serait la meilleure façon?

Depuis que je ne voulais pas un pont de code SQL, ma seule idée tout-SQL est:

select tablename and column_name from INFORMATION_SCHEMA.COLUMNS 

... puis utilisez un curseur pour parcourir toutes les colonnes, et pour tous les types de données de nvarchar je voudrais exécuter SQL dynamique comme:

SELECT * from @table where @column = @myvalue 

Inutile de dire, c'est lent et un porc de la mémoire.

Vous avez des idées?

+1

Est-ce vraiment important que c'est «lent». Tant que c'est plus rapide que de chercher manuellement, vous gagnez. À moins que ce soit un processus dans votre demande pour une raison ou une autre. Dans ce cas, vous devriez vraiment vous pencher sur la conception de votre solution. –

+0

vrai. C'est un outil utilisé en Dev, non en production, et c'est plus rapide que de chercher manuellement.J'étais juste curieux d'une meilleure façon car je ne suis pas vraiment un expert SQL et je me suis dit qu'il y avait une approche plus directe. – LoveMeSomeCode

Répondre

3

Voici quelques liens à parler de la façon de procéder:

Les deux d'entre eux utilisent l'approche que vous espériez éviter. Affinez-les afin qu'ils ne fouillent que les colonnes qui étaient des clés étrangères devraient améliorer leurs performances en éliminant la recherche de tables inutiles.

+0

C'est ainsi que j'ai fini par aller. En outre, un +1 pour me faire sentir mieux sur la façon dont je le faisais déjà :) – LoveMeSomeCode

6

Vider la base de données et grep?

Je suppose qu'une question plus ciblée pourrait être: si vous ne savez pas comment le schéma fonctionne, qu'allez-vous faire avec la réponse que vous obtenez de toute façon?

+1

+1 pour _si vous ne savez pas comment le schéma fonctionne, qu'allez-vous faire avec la réponse que vous obtenez de toute façon? _ –

+0

bien, c'est un FK. J'ai juste besoin de construire un lien entre deux tables pour pouvoir stocker les données associées. Les données elles-mêmes ne sont pas importantes en ce moment, aussi longtemps que je les relie pour les capturer. Comment va-t-on déverser toute la base de données en texte? – LoveMeSomeCode

0

Il suffit de faire SP qui recherche dans toutes les colonnes pertinentes en utilisant OU. Pourquoi ne connaissez-vous pas les colonnes sur lesquelles effectuer la recherche?

Si la liste des colonnes change constamment, vous devez juste vous assurer que le processus résultant de la modification du schéma entraînera la modification de cette procédure stockée. Si la liste des colonnes est trop grosse pour que vous puissiez taper le SP, utilisez un peu de perl/grep/whatnot élémentaire pour le faire en 1 ligne, par exemple pour SYBASE.

my_dump_table_schema.pl|egrep "(CHAR| VARCHAR)"|awk '{$1}'|tr "\012" " "|perl -pe '{s//= \@SEARCH_VALUE OR /g}'; echo ' = @SEARCH_VALUE' 

Le dernier écho est nécessaire d'ajouter la valeur à la dernière colonne

2

Voici une solution que j'ai écrit il y a plusieurs années: http://www.users.drew.edu/skass/sql/SearchAllTables.sql.txt

+0

c'est en fait ce que j'avais plus ou moins. C'est vraiment lent sur cet énorme db, et un tas de mémoire, mais ça fait l'affaire. – LoveMeSomeCode

+0

salut, est-il un moyen de ne rechercher que des colonnes spécifiques à travers un couple de tables. – aggie

+0

Dans les deux premières requêtes SELECT de l'exemple, vous pouvez ajouter des conditions à la clause WHERE pour limiter le résultat à des noms de tables et de colonnes particuliers. –