2017-07-13 2 views
0

J'utilise un algorithme de recherche pour trouver dans ma base de données des tables répondant à certains critères. La sortie ressemble à ceci:Est-il possible de rechercher plusieurs colonnes à partir de plusieurs tables en utilisant des variables pour les références?

TableName  |  ColumnName 
--------------+--------------- 
Table1  |  Column1 
Table1  |  Column2 
Table1  |  Column3 
Table2  |  Column4 
Table2  |  Column1 
...   |  ... 
Table652  |  Column873 

J'essaie alors d'utiliser cette table comme entrée pour une autre requête où je tentais d'utiliser soit:

WHERE Tablename.ColumnName LIKE 'Post 2013 - %' 

Ou

WHERE ((TableName).(ColumnName)) LIKE 'Post 2013 - %' 

Ou

SELECT ... 
CONCAT(TableName, '.', ColumnName) AS TabCol 
FROM search 
WHERE TabCol LIKE 'Post 2013 - %' 

Le problème est à mon code retourne des erreurs à chacun de ces états WHERE. Est-il possible pour moi d'utiliser la première sortie comme un moyen de parcourir ces tables pour une valeur spécifique, retournant le TableName et ColumnName où il a trouvé la valeur?

+1

Probablement, vous avez besoin de SQL dynamique. –

Répondre

0

Pour faire quelque chose comme ça, il y a généralement deux méthodes que j'ai trouvé qui fonctionnent. La première consiste à extraire la base de données entière en fichier texte et à utiliser un outil de recherche de texte pour les données que vous recherchez.

L'autre consiste à utiliser les tables système pour identifier tous les tabels/champs. Ensuite, ayez une boucle de code dans les champs qui exécutent votre requête. Vous souhaiterez peut-être d'abord vérifier le type de données pour éliminer des éléments tels que les types de données date, numérique ou entier. Ou vous pourriez le faire manuellement. Mais il n'y a pas vraiment de moyen standard pour faire cela.

0

Si vous utilisez SQL Server en tant que base de données: - Vous pouvez utiliser des requêtes dynamiques.

Vous pouvez écrire une procédure stockée ou une fonction qui a une logique similaire à celle de la capture d'écran qui renvoie les données de la table dont les résultats souhaités. Et vous pouvez passer Tablename, Columnname, Conditions en tant que paramètres. En supposant que vous avez toutes les données dans le tableau.

enter image description here

Voici une exemple de requête j'ai essayé avec le scénario ci-dessus. J'ai juste essayé avec l'échantillon ... il peut y avoir plusieurs scénarios avec des conditions. J'espère que cela vous aide à vous donner une idée de la façon de résoudre votre problème!

+0

Au moins 'QUOTENAME (nom_table)' et 'QUOTENAME (nom_colonne)' s'il vous plaît. Vous ne savez pas quelles valeurs ces variables stockent. Jetez également un coup d'oeil à 'sp_executesql' quand il s'agit de SQL dynamique. – Pred

+0

Oui, vous pouvez les utiliser mais j'ai juste donné un échantillon rapide. Je ne suis pas sûr que le SGBD soit un serveur sql ou non. Je veux juste donner une idée de la façon de résoudre le problème. De toute façon merci pour ces commentaires –

+0

Vous pouvez -> Vous devriez. Rend le code plus sûr en empêchant certains vecteurs d'attaque par injection sql. Même si elle ne fait qu'interroger les métadonnées, la requête peut être syntaxiquement incorrecte sans elles. Quand par exemple le nom d'une table est 'transacton' ou n'importe quel mot réservé qui doit être cité. – Pred