Rechercher une chaîne de caractères dans toutes les tables, lignes et colonnes d'un DB
Je suis perdu dans une grosse base de données et je ne suis pas en mesure de trouver l'endroit où les données que je reçois vient de. Je me demandais si il est possible avec SQL Server 2005 pour rechercher une chaîne de caractères dans tous les tableaux, les lignes et les colonnes d'une base de données?
Quelqu'un a une idée si c'est possible, et comment?
- Voir aussi,,, stackoverflow.com/questions/13174627/...
- Voir aussi mssqltips.com/sqlservertip/4039/...
Vous devez vous connecter pour publier un commentaire.
Ce code doit le faire en SQL 2005, mais quelques bémols:
C'est RIDICULEMENT lent. Je l'ai testé sur une petite base de données que j'ai avec seulement une poignée de tables et il a fallu plusieurs minutes pour terminer. Si votre base de données est tellement grande que vous ne pouvez pas le comprendre, alors ce sera probablement inutilisable de toute façon.
J'ai écrit ce improvisée. Je n'ai pas mis dans toute erreur de manipulation et il pourrait y avoir quelques autres médiocrité surtout depuis que je ne pas utiliser des curseurs souvent. Par exemple, je pense qu'il y a une manière d'actualiser les colonnes du curseur, au lieu de fermer/désallocation/recréer à chaque fois.
Si vous ne pouvez pas comprendre la base de données ou vous ne savez pas où les choses viennent, alors vous devriez probablement trouver quelqu'un qui ne. Même si vous pouvez trouver l'endroit où les données, il peut être dupliqué quelque part ou il y a peut être d'autres aspects de la base de données que vous ne comprenez pas. Si personne dans votre entreprise comprend la base de données, alors vous êtes dans un assez grand désordre.
QUOTENAME
pour tous les noms d'objet pour gérer les choses comme les espaces dans les noms de table.Je vous suggère de vous trouver vous-même une 3ème partie pour cela l'outil comme ApexSQL De Recherche (il y en a probablement d'autres aussi, mais je l'utiliser parce que c'est gratuit).
Si vous voulez vraiment aller le SQL façon, vous pouvez essayer d'utiliser la procédure stockée créé par
Sorna Kumar Muthuraj – copié le code est ci-dessous. Juste exécuter cette procédure stockée pour toutes les tables de votre schéma (facile avec la dynamique SQL)
Bien que les solutions présentées avant sont valables et de travail, je humblement vous proposons un code plus propre, plus élégante, et avec une meilleure performance, à moins que je le vois.
Tout d'abord, on peut se demander: Pourquoi serait-on toujours besoin d'un extrait de code à l'échelle mondiale et à l'aveugle rechercher une chaîne de caractères? Hey, ils ont déjà inventé fulltext, ne savez-vous pas?
Ma réponse: principalement mon travail est à l'intégration des systèmes de projets, et de découvrir où les données sont écrites est important à chaque fois que j'apprends un nouveau et undocummented base de données, ce qui arrive rarement.
Aussi, le code que j'ai actuellement est une version allégée d'un plus puissant et dangereux script qui cherche et REMPLACE le texte dans la base de données.
Si vous êtes "obtenir les données" à partir d'une application, la chose la plus sensée serait d'utiliser le profiler et le profil de la base de données lors de l'exécution de l'application. Il Trace, puis recherche les résultats de cette chaîne.
La SSMS PACK des Outils d'complément (Add-on) pour Microsoft SQL Server Management Studio et Microsoft SQL Server Management Studio Express, faire exactement ce dont vous avez besoin. Sur la plus grande base de données il faut un certain temps à la recherche, mais qui doit être prévu. Il comprend également une tonne de fonctionnalités intéressantes qui devraient être inclus avec SQL Server Management Studio en premier lieu. Essayer http://www.ssmstoolspack.com/
Vous avez besoin d'avoir le SP2 de SQL Server Management Studio est installé pour exécuter les outils.
J'ai adapté un script écrit à l'origine par Narayana Vyas Kondreddi en 2002. J'ai changé la clause where pour vérifier le texte/ntext champs, en utilisant patindex plutôt que comme. J'ai aussi changé le tableau des résultats légèrement. Sans raison, j'ai changé les noms de variables, et aligné que je préfère (pas de manque de respect à M. Kondretti). L'utilisateur peut vouloir modifier les types de données recherchées. J'ai utilisé un tableau global pour permettre l'interrogation de la mi-traitement, mais une table permanente pourrait être une façon plus intelligente d'aller.
D'autres réponses postées déjà peut fonctionner tout aussi bien, sinon mieux, mais je n'ai pas utilisées. Cependant, le SQL suivant que j'ai utilisé, et il m'a vraiment aidé quand j'essayais de l'ingénierie inverse sur un gros système avec un énorme (et très unorganzied) base de données SQL Server.
Ce n'est pas mon code. Je souhaite que je pourrais le crédit à l'auteur original, mais je ne trouve pas le lien vers l'article plus 🙁
Fait Im accord avec MikeW (+1), il est préférable d'utiliser profiler pour ce cas.
De toute façon, si vous avez vraiment besoin de saisir toutes les (n)des colonnes varchar (en db) et faire une recherche. Voir ci-dessous.
Je suppose que pour l'utilisation INFORMATION_SCHEMA.Tables + SQL dynamique.
La plaine de recherche:
et une avec COMME clause:
@NLwino, yery bonne requête avec quelques erreurs pour l'utilisation du mot clé. J'ai dû modifier un peu pour envelopper les mots-clés avec [ ] et aussi regarder char et ntext colonnes.
J'ai couru sur 2,5 GO de base de données et il est revenu en 51 secondes
Ce n'utilise pas de curseurs ou quelque chose comme ça, juste une requête dynamique.
Notez également qu'il utilise
LIKE
. Depuis ce qui est arrivé à être ce dont j'avais besoin. Il fonctionne pour tous les schémas, toutes les tables et seulement de la requête de ces colonnes sont desNVARCHAR
ouVARCHAR
même si elles ont à séparation d'urine.La sortie vous donne la table, la colonne et la valeur. De temps à s'exécuter sur une petite base de données a été ~3 secondes, avait environ 3000 résultats.
AS table
àAS [table]
et ainsi de suite.À "trouver l'endroit où les données que je reçois vient de", vous pouvez démarrer le générateur de profils SQL, commencez votre rapport ou de l'application, et vous verrez toutes les requêtes émises à l'encontre de votre base de données.
Je pense que cela peut être une manière la plus facile de trouver une chaîne de caractères dans toutes les lignes de votre base de données sans l'aide de curseurs et POUR XML-.
Par la création de cette procédure stockée, vous pouvez exécuter de n'importe quelle chaîne vous voulez trouver comme ceci:
Le résultat sera comme ceci:
Ou, vous pouvez utiliser ma requête ici, devrait être plus simple que d'avoir à créer sProcs pour chaque id de votre recherche: FullParam SQL Blog
SÉLECTIONNEZ TableName, ColumnName, ColumnValue, ColumnType, COUNT(*) QUE le Comte DE #Résultats
GROUPE PAR TableName, ColumnName, ColumnValue, ColumnType
Cette requête peut faire la chose pour vous.