Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment rechercher des tables contenant une colonne spécifique dans SQL Server

Bien qu'extrêmement puissant en tant que base de données relationnelle, SQL Server peut parfois être quelque peu intimidant lorsqu'il s'agit de rechercher des informations sous-jacentes sur le système de base de données lui-même.

Pour soulager ces maux de tête dans une petite partie, nous allons brièvement explorer comment trouver toutes les tables de la base de données qui contiennent un nom de colonne particulier .

Vues du catalogue SQL Server

Un concept de base à comprendre à propos de SQL Server est celui des catalog views , qui sont en fait des tables de base de données (catalogs dans ce cas) qui affichent des informations à l'échelle du système sur le moteur de base de données SQL Server.

Interrogation des informations système

Toutes les catalog views sont accessibles via un SELECT Instruction SQL FROM un catalogue spécifique dans le sys. espace de noms.

Par exemple, l'instruction suivante peut être utilisée pour afficher des informations sur toutes les tables de base de données du système via sys.tables catalogue :

SELECT
  *
FROM
  sys.tables

Instruction LIKE et caractère générique

Avant d'entrer dans la façon d'extraire toutes les tables avec un nom particulier, nous devrions brièvement explorer ce que le LIKE fait, ainsi que le caractère générique (% ) et comment ils sont utilisés ensemble.

LIKE est utilisé dans une requête pour déterminer si un modèle particulier de caractères (généralement les valeurs d'une column spécifiée ) correspondent à une chaîne de caractères formatée.

LIKE est souvent également utilisé en conjonction avec le % caractère, qui représente un caractère générique lors de la tentative de correspondance avec le modèle. Lorsqu'un % caractère générique est présent dans la chaîne de modèle, il indique que tout caractères peuvent être présents à cet emplacement de la chaîne de modèle et être toujours considérés comme une correspondance.

Par exemple, si nous voulons trouver tous les livres où le title commence avec "Le" mais peut contenir n'importe quel caractère par la suite, nous utiliserions une déclaration comme celle-ci :

SELECT
  title,
  primary_author,
  published_date
FROM
  books
WHERE
  title LIKE 'The%'

Les lecteurs attentifs pourraient se rendre compte que le modèle ci-dessus correspondrait non seulement aux titres qui avaient "Le" au début, mais également à tous les titres dont les mots commencent simplement par les trois lettres "Le". Depuis % les caractères génériques correspondent à n'importe quel caractère, si nous ne voulons vérifier que les titres avec le mot "Le", ajouter un espace est plus approprié :

SELECT
  title,
  primary_author,
  published_date
FROM
  books
WHERE
  title LIKE 'The %'

Sélectionner des tables contenant un nom de colonne

Avec nos connaissances de base des deux catalog views et le LIKE déclaration, nous sommes maintenant équipés pour rechercher toutes les tables de notre système qui contiennent un nom de colonne particulier :

SELECT
  sys.columns.name AS ColumnName,
  tables.name AS TableName
FROM
  sys.columns
JOIN sys.tables ON
  sys.columns.object_id = tables.object_id
WHERE
  sys.columns.name = 'ColumnName'

Nous devons combiner les informations de deux catalogues, sys.tables et sys.columns , nous utilisons donc un JOIN déclaration. Les deux sont associés par le object_id champ, donc nous JOIN sur ce champ.

À partir de là, il suffit de sélectionner le ColumnName et TableName de nos résultats, et enfin, bien sûr, en ne recherchant que les enregistrements où sys.columns.name est égal à notre ColumnName chaîne.

Cependant, cette requête ne trouvera que des correspondances exactes du nom de la colonne. Si nous voulons trouver des correspondances partielles, nous pouvons utiliser LIKE et % caractères génériques à la place :

SELECT
  sys.columns.name AS ColumnName,
  tables.name AS TableName
FROM
  sys.columns
JOIN sys.tables ON
  sys.columns.object_id = tables.object_id
WHERE
  sys.columns.name LIKE '%ColumnName%'

Nous l'avons! Une requête simple pour rechercher toutes les tables et les colonnes associées avec un nom de colonne particulier (ou similaire).