Trouver toutes les tables contenant une colonne avec un nom spécifié - MS SQL Server

1202

Est-il possible de rechercher des noms de table contenant des colonnes

LIKE '%myName%'

?

gruber
la source
12
Il existe un plugin incroyable pour le serveur SQL qui peut rechercher tous les types d'objets. sql search red-gate.com/products/sql-development/sql-search
Vbp
1
@vbp: sql-search est génial en effet, mais comme de nombreux outils, il ne fonctionne pas avec SQL Server 2000 (oui, je suis coincé avec ça en ce moment: - /)
Patrick Honorez
2
@vbp La recherche ApexSQL pour SSMS offre encore plus
Junchen Liu

Réponses:

1851

Tableaux de recherche:

SELECT      c.name  AS 'ColumnName'
            ,t.name AS 'TableName'
FROM        sys.columns c
JOIN        sys.tables  t   ON c.object_id = t.object_id
WHERE       c.name LIKE '%MyName%'
ORDER BY    TableName
            ,ColumnName;

Rechercher des tableaux et des vues:

SELECT      COLUMN_NAME AS 'ColumnName'
            ,TABLE_NAME AS  'TableName'
FROM        INFORMATION_SCHEMA.COLUMNS
WHERE       COLUMN_NAME LIKE '%MyName%'
ORDER BY    TableName
            ,ColumnName;
AdaTheDev
la source
17
Les INFORMATION_SCHEMA vues @Revious incluses dans SQL Server sont conformes à la définition de la norme ISO pour INFORMATION_SCHEMA. , sys.columns, sys.tablesEst spécifique à Microsoft Sql Server.
Tomasito
4
L'inclusion TABLE_SCHEMAdans votre liste de sélection peut être utile. Toujours +1 car c'est une bonne réponse.
Bernhard Hofmann
1
Pouvez-vous ajouter l'explication des différences entre les deux à votre réponse commentée par @ user3185569?
Ryan Gates
1
Le second fonctionne également avec SQL Server 2000, si vous devez utiliser cela
Patrick Honorez
1
obtenez également un schéma de table: SELECT c.name AS ColName, t.name AS TableName, SCHEMA_NAME (t.schema_id) AS SchemaName ....
Skorunka František
327

Nous pouvons également utiliser la syntaxe suivante: -

select * from INFORMATION_SCHEMA.COLUMNS 
where COLUMN_NAME like '%clientid%' 
order by TABLE_NAME
Khwaza Bandenawaz
la source
10
Cela a fonctionné pour moi et la première réponse n'a pas fonctionné (j'utilise MariaDB).
Aubrey Robertson
3
Pas étonnant qu'il fonctionne sur toutes ces différentes bases de données étant donné qu'il INFORMATION_SCHEMAfait partie de la norme ANSI
Davos
181

Serveur SQL:

SELECT Table_Name, Column_Name 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_CATALOG = 'YOUR_DATABASE'
AND COLUMN_NAME LIKE '%YOUR_COLUMN%'

Oracle:

SELECT owner, table_name, column_name 
FROM all_tab_columns 
WHERE column_name LIKE '%YOUR_COLUMN_NAME%'
AND OWNER IN ('YOUR_SCHEMA_NAME');
  • AUSSI SIMPLE QUE CELA!! (SQL, PL / SQL)
    Je l'utilise TOUT le temps pour trouver TOUTES les instances d'un nom de colonne dans une base de données donnée (schéma).
Todd-ECU
la source
4
Je copie et colle ce SQL très souvent, merci @Todd_ECU
jonaglon
1
Cela devrait vraiment être la réponse acceptée. Vous n'avez pas à effectuer de jointures, ce qui le rend beaucoup plus facile que la réponse acceptée
Kolob Canyon
106
select  
        s.[name]            'Schema',
        t.[name]            'Table',
        c.[name]            'Column',
        d.[name]            'Data Type',
        c.[max_length]      'Length',
        d.[max_length]      'Max Length',
        d.[precision]       'Precision',
        c.[is_identity]     'Is Id',
        c.[is_nullable]     'Is Nullable',
        c.[is_computed]     'Is Computed',
        d.[is_user_defined] 'Is UserDefined',
        t.[modify_date]     'Date Modified',
        t.[create_date]     'Date created'
from        sys.schemas s
inner join  sys.tables  t
on s.schema_id = t.schema_id
inner join  sys.columns c
on t.object_id = c.object_id
inner join  sys.types   d
on c.user_type_id = d.user_type_id
where c.name like '%ColumnName%'

Cela vous donnera ici quelques informations supplémentaires sur le schéma, les tables et les colonnes sur lesquelles vous pouvez ou non choisir d'utiliser des conditions supplémentaires dans votre clause where pour filtrer. Par exemple, si vous vouliez seulement voir les champs qui doivent avoir des valeurs ajouter

and c.is_nullable = 0

Vous pouvez ajouter d'autres conditions, j'ai également ajouté les colonnes de la clause select de cette manière verticale afin qu'il soit facile de réorganiser, supprimer, renommer ou ajouter d'autres en fonction de vos besoins. Alternativement, vous pouvez rechercher uniquement des tables en utilisant T.Name. C'est très personnalisable.

Prendre plaisir.

Francis Rodgers
la source
3
d. [max_length] semble un peu inutile. c. [max_length] est peut-être ce que vous vouliez dire. Mais votez toujours pour m'y amener.
user1566694
vous pouvez mettre cela à la fin de votre requête 🤫 "COMMANDER PAR t.name"
Fuat
Attention aux utilisateurs. La requête ci-dessus implique l'accès à l'objet 'sys' qui n'est pas toujours vrai. Dans mon cas par exemple, cette requête n'a retourné rien. Au lieu de cela, l'utilisation de «INFORMATION_SCHEMA» a fonctionné comme un charme.
OrizG
85

Cela devrait fonctionner:

SELECT name 
FROM sysobjects 
WHERE id IN ( SELECT id 
              FROM syscolumns 
              WHERE name like '%column_name%' )
cichy
la source
6
J'utiliserais à la sys.tablesplace de sysobjects(qui est obsolète à partir de SQL Server 2005)
marc_s
3
Nom de colonne non valide 'id'
JSON
62

Si vous préférez les outils tiers, il existe de nombreuses options telles que:

Celles-ci sont très utiles si votre base de données contient des objets chiffrés (vues, procédures, fonctions) car vous ne pouvez pas facilement les rechercher à l'aide des tables système.

Dwoolk
la source
46

Je ne sais pas pourquoi tant d'entre vous suggérant de se joindre à sys.table with sys.columns vous peuvent simplement utiliser le code ci-dessous:

Select object_name(object_id) as TableName,* from SYS.columns where name LIKE '%MyName%'

ou

Si vous souhaitez également le nom du schéma:

Select * from  INFORMATION_SCHEMA.COLUMNS
where COLUMN_NAME LIKE '%MyName%'
user3583912
la source
1
Ils obtiennent le nom du schéma à partir de sys.tables, ce n'est peut-être pas un problème pour vous, mais c'est pour beaucoup de gens.
K Kimble
Salut, mais il n'est toujours pas nécessaire de se joindre à sys.objects pour le nom du schéma, vous pouvez utiliser Select * dans INFORMATION_SCHEMA.COLUMNS où COLUMN_NAME LIKE '% MyName%'
user3583912
C'est bien que vous signaliez INFORMATION_SCHEMA.COLUMNS, mais si vous exécutez EXEC sp_helptext INFORMATION_SCHEMA.COLUMNS, vous pouvez voir qu'il fait en effet la même chose, et beaucoup d'autres choses inutiles dont vous pourriez ne pas avoir besoin.
K Kimble
40

Si vous voulez simplement le nom de la table, vous pouvez l'exécuter:

select object_name(object_id) from sys.columns
where name like '%received_at%'

Si vous voulez également le nom du schéma (ce qui dans de nombreux cas, vous le ferez, car vous aurez beaucoup de schémas différents, et à moins que vous ne vous souveniez de chaque table de la base de données et où il appartient, cela peut être utile) exécutez:

select OBJECT_SCHEMA_NAME(object_id),object_name(object_id) from sys.columns
where name like '%received_at%'

et enfin si vous le voulez dans un format plus agréable (bien que ce soit là que le code (à mon avis) devient trop compliqué pour une écriture facile):

select concat(OBJECT_SCHEMA_NAME(object_id),'.',object_name(object_id)) from sys.columns
where name like '%received_at%'

notez que vous pouvez également créer une fonction basée sur ce que j'ai:

CREATE PROCEDURE usp_tablecheck
--Scan through all tables to identify all tables with columns that have the provided string
--Stephen B
@name nvarchar(200)
AS
SELECT CONCAT(OBJECT_SCHEMA_NAME(object_id),'.',object_name(object_id)) AS [Table Name], name AS [Column] FROM sys.columns
WHERE name LIKE CONCAT('%',@name,'%')
ORDER BY [Table Name] ASC, [Column] ASC
GO

Il convient de noter que la fonction de concaténation a été ajoutée en 2012. Pour 2008r2 et versions antérieures, utilisez + pour concaténer des chaînes.

J'ai reformaté le proc un peu depuis que j'ai posté ça. Il est un peu plus avancé maintenant mais semble beaucoup plus compliqué (mais il est dans un proc donc vous ne le verrez jamais) et il est mieux formaté.

Cette version vous permet de l'avoir dans une base de données administrative puis de rechercher dans n'importe quelle base de données. Modifiez la décaleration de @dbde 'master'à celle que vous souhaitez que la base de données par défaut soit (REMARQUE: l'utilisation de la fonction CONCAT () ne fonctionnera qu'avec 2012+ sauf si vous modifiez la concaténation de chaîne pour utiliser les +opérateurs).

CREATE PROCEDURE [dbo].[usp_tablecheck]
    --Scan through all tables to identify all tables in the specified database with columns that have the provided string
    --Stephen B
    @name nvarchar(200)
    ,@db nvarchar(200) = 'master'
AS
    DECLARE @sql nvarchar(4000) = CONCAT('
        SELECT concat(OBJECT_SCHEMA_NAME(col.object_id,DB_ID(''',@db,''')),''.'',object_name(col.object_id,DB_ID(''',@db,'''))) AS [Table Name]
            ,col.name AS [Column] 
        FROM ',@db,'.sys.columns col
        LEFT JOIN ',@db,'.sys.objects ob 
            ON ob.object_id = col.object_id
        WHERE 
            col.name LIKE CONCAT(''%'',''',@name,''',''%'') 
            AND ob.type =''U''
        ORDER BY [Table Name] ASC
            ,[Column] ASC')
    EXECUTE (@sql)
GO
Ste Bov
la source
26
USE AdventureWorks

GO

SELECT t.name AS table_name, SCHEMA_NAME(schema_id) AS schema_name,
 c.name AS column_name
FROM sys.tables AS t
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
WHERE c.name LIKE '%EmployeeID%'
ORDER BY schema_name, table_name; 

C'est du blog de Pinal Sir

shadab shah
la source
24
SELECT COLUMN_NAME, TABLE_NAME
  FROM INFORMATION_SCHEMA.COLUMNS    
 WHERE COLUMN_NAME LIKE '%myName%'
Neil Knight
la source
23

Vous pouvez le trouver dans INFORMATION_SCHEMA.COLUMNS par filtre nom_colonne

Select DISTINCT TABLE_NAME as TableName,COLUMN_NAME as ColumnName
     From INFORMATION_SCHEMA.COLUMNS Where column_name like '%myname%'
Munavvar
la source
21
SELECT  [TABLE_NAME] ,
        [INFORMATION_SCHEMA].COLUMNS.COLUMN_NAME
FROM    INFORMATION_SCHEMA.COLUMNS
WHERE   INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME LIKE '%NAME%' ;
Ritesh Varma-MCA
la source
17

La requête suivante vous donnera les noms de table exacts de la base de données ayant un nom de champ comme '% myName'.

SELECT distinct(TABLE_NAME)
  FROM INFORMATION_SCHEMA.COLUMNS    
 WHERE COLUMN_NAME LIKE '%myName%'
Shaikh Farooque
la source
15

Pour obtenir des informations complètes: nom de colonne, nom de table ainsi que schéma de la table.

SELECT COLUMN_NAME, TABLE_NAME, TABLE_SCHEMA
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE COLUMN_NAME LIKE '%col_Name%'
Kaleab
la source
13

je viens de l'essayer et cela fonctionne parfaitement

USE YourDatabseName
GO
SELECT t.name AS table_name,
SCHEMA_NAME(schema_id) AS schema_name,
c.name AS column_name
FROM sys.tables AS t
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
WHERE c.name LIKE '%YourColumnName%'
ORDER BY schema_name, table_name;

Modifiez uniquement YourDatbaseName en votre base de données et YourcolumnName en nom de colonne que vous recherchez pour le reste, gardez-le tel quel.

J'espère que cela a aidé

Alz
la source
8
DECLARE @columnName as varchar(100)
SET @columnName = 'ColumnName'

SELECT t.name AS Table, c.name AS Column,
ty.name AS Type, c.max_length AS Length
FROM sys.tables AS t
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
INNER JOIN sys.types ty ON c.system_type_id = ty.system_type_id
WHERE c.name LIKE @columnName
ORDER BY t.name, c.name
Mauro Bilotti
la source
7

Je l'ai utilisé dans le même but et cela a fonctionné:

  select * from INFORMATION_SCHEMA.COLUMNS
  where TABLE_CATALOG= 'theDatabase'
  and COLUMN_NAME like 'theCol%'
Rainhider
la source
6

J'espère que ce n'est pas une réponse en double, mais ce que j'aime faire, c'est générer une instruction sql dans une instruction sql qui me permettra de rechercher les valeurs que je recherche (pas seulement les tables avec ces noms de champs (comme c'est généralement nécessaire pour que je supprime ensuite toutes les informations relatives à l'ID du nom de colonne que je recherche):

  SELECT  'Select * from ' + t.name + ' where ' + c.name + ' = 148' AS SQLToRun
  FROM sys.columns c, c.name as ColName, t.name as TableName
  JOIN sys.tables t 
     ON c.object_id = t.object_id
  WHERE c.name LIKE '%ProjectID%'

Ensuite, je peux copier et coller exécuter ma 1ère colonne "SQLToRun" ... puis je remplace le "Select * from" par "Delete from" et cela me permet de supprimer toutes les références à cet ID donné! Écrivez ces résultats dans un fichier afin que vous les avoir juste au cas où.

REMARQUE **** Assurez-vous d'éliminer toutes les tables de préparation avant d'exécuter votre instruction de suppression ...

  SELECT  'Delete from ' + t.name + ' where ' + c.name + ' = 148' AS SQLToRun
  FROM sys.columns c, c.name as ColName, t.name as TableName
  JOIN sys.tables t 
     ON c.object_id = t.object_id
  WHERE c.name LIKE '%ProjectID%'
Dan B
la source
6
SELECT t.name AS table_name, 
    SCHEMA_NAME(schema_id) AS schema_name,
    c.name AS column_name
FROM sys.tables AS t INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
WHERE c.name LIKE '%Label%'
ORDER BY schema_name, table_name;
PedroSouki
la source
6

Comme Oracle, vous pouvez trouver des tableaux et des colonnes avec ceci:

select table_name, column_name
from user_tab_columns 
where column_name 
like '%myname%';
Iceknight
la source
5

Je voulais quelque chose pour les tableaux et les vues qui ne me faisaient pas saigner.

Requete

SELECT
    t.TABLE_TYPE AS [Type],
    c.TABLE_NAME AS [Object],
    c.COLUMN_NAME AS [Column]
FROM
    INFORMATION_SCHEMA.COLUMNS AS c
    LEFT JOIN INFORMATION_SCHEMA.TABLES AS t ON
        t.TABLE_CATALOG = c.TABLE_CATALOG AND 
        t.TABLE_SCHEMA = c.TABLE_SCHEMA AND
        t.TABLE_NAME = c.TABLE_NAME
WHERE
    c.COLUMN_NAME LIKE '%myName%'
ORDER BY
    [Type],
    [Object],
    [Column]

Résultat

Type        Object   Column
----------------------------
BASE TABLE  Table1   myName1
BASE TABLE  Table2   myName2
VIEW        View1    myName1
VIEW        View2    myName2
MarredCheese
la source
4

Juste pour améliorer les réponses ci-dessus, j'ai également inclus des vues et concaténé le schéma et la table / vue, ce qui rend les résultats plus apparents.

DECLARE @COLUMNNAME AS VARCHAR(100);

SET @COLUMNNAME = '%Absence%';

SELECT CASE
           WHEN [T].[NAME] IS NULL
           THEN 'View'
           WHEN [T].[NAME] = ''
           THEN 'View'
           ELSE 'Table'
       END AS [TYPE], '[' + [S].[NAME] + '].' + '[' + CASE
                                                          WHEN [T].[NAME] IS NULL
                                                          THEN [V].[NAME]
                                                          WHEN [T].[NAME] = ''
                                                          THEN [V].[NAME]
                                                          ELSE [T].[NAME]
                                                      END + ']' AS [TABLE], [C].[NAME] AS [COLUMN]
FROM [SYS].[SCHEMAS] AS [S] LEFT JOIN [SYS].[TABLES] AS [T] ON [S].SCHEMA_ID = [T].SCHEMA_ID
                            LEFT JOIN [SYS].[VIEWS] AS [V] ON [S].SCHEMA_ID = [V].SCHEMA_ID
                            INNER JOIN [SYS].[COLUMNS] AS [C] ON [T].OBJECT_ID = [C].OBJECT_ID
                                                                 OR
                                                                 [V].OBJECT_ID = [C].OBJECT_ID
                            INNER JOIN [SYS].[TYPES] AS [TY] ON [C].[SYSTEM_TYPE_ID] = [TY].[SYSTEM_TYPE_ID]
WHERE [C].[NAME] LIKE @COLUMNNAME
GROUP BY '[' + [S].[NAME] + '].' + '[' + CASE
                                             WHEN [T].[NAME] IS NULL
                                             THEN [V].[NAME]
                                             WHEN [T].[NAME] = ''
                                             THEN [V].[NAME]
                                             ELSE [T].[NAME]
                                         END + ']', [T].[NAME], [C].[NAME], [S].[NAME]
ORDER BY '[' + [S].[NAME] + '].' + '[' + CASE
                                             WHEN [T].[NAME] IS NULL
                                             THEN [V].[NAME]
                                             WHEN [T].[NAME] = ''
                                             THEN [V].[NAME]
                                             ELSE [T].[NAME]
                                         END + ']', CASE
                                                        WHEN [T].[NAME] IS NULL
                                                        THEN 'View'
                                                        WHEN [T].[NAME] = ''
                                                        THEN 'View'
                                                        ELSE 'Table'
                                                    END, [T].[NAME], [C].[NAME];
Stephen Brett
la source
4

Vous pouvez essayer cette requête:

USE AdventureWorks
GO
SELECT t.name AS table_name,
SCHEMA_NAME(schema_id) AS schema_name,
c.name AS column_name
FROM sys.tables AS t
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
WHERE c.name LIKE '%myName%'
soheila sadeghian
la source
1
Ressemble très similaire à blog.sqlauthority.com/2008/08/06/… peut aider à l'explication si rien d'autre.
user3428422
4

Voici la réponse à votre question

SELECT c.name AS ColumnName, t.name AS TableName
FROM sys.columns c
    JOIN sys.tables t ON c.object_id = t.object_id
WHERE c.name LIKE '%myName%';
Yogendra
la source
3
Create table #yourcolumndetails(
DBaseName varchar(100), 
TableSchema varchar(50), 
TableName varchar(100),
ColumnName varchar(100), 
DataType varchar(100), 
CharMaxLength varchar(100))

EXEC sp_MSForEachDB @command1='USE [?];
    INSERT INTO #yourcolumndetails SELECT
    Table_Catalog
    ,Table_Schema
    ,Table_Name
    ,Column_Name
    ,Data_Type
    ,Character_Maximum_Length
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE COLUMN_NAME like ''origin'''

select * from #yourcolumndetails
Drop table #yourcolumndetails
Joby
la source
C'est ce que je cherchais, une solution dans TOUTE base de données, pas une seule.
Fandango68
0

Voici une solution de travail pour une base de données Sybase

select 
  t.table_name, 
  c.column_name 
from 
  systab as t key join systabcol as c 
where 
   c.column_name = 'MyColumnName'
Janey
la source
2
N'a pas marché. Syntaxe incorrecte près du mot clé "clé".
Paiman Samadian le
0

Nous pouvons utiliser sp_columnsà cette fin.

sp_columns 'table name', null, null, '%column name%'
Cheikh Abdul Wahid
la source
0

Requête SQL pour afficher toutes les tables qui ont un nom de colonne spécifié:

SELECT SCHEMA_NAME(schema_id) + '.' + t.name AS 'Table Name'
  FROM sys.tables t
 INNER JOIN sys.columns c ON c.object_id = t.object_id
 WHERE c.name like '%ColumnName%'
 ORDER BY 'Table Name'
Raj
la source