web-dev-qa-db-fra.com

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

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

LIKE '%myName%'

?

955
gruber

Tables 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;

Recherche dans les tableaux et vues:

SELECT      COLUMN_NAME AS 'ColumnName'
            ,TABLE_NAME AS  'TableName'
FROM        INFORMATION_SCHEMA.COLUMNS
WHERE       COLUMN_NAME LIKE '%MyName%'
ORDER BY    TableName
            ,ColumnName;
1524
AdaTheDev

Nous pouvons également utiliser la syntaxe suivante: -

select * from INFORMATION_SCHEMA.COLUMNS 
where COLUMN_NAME like '%clientid%' 
order by TABLE_NAME
260
Khwaza Bandenawaz
SQL Server:

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). 
117
Todd ECU

Cela devrait fonctionner:

SELECT name 
FROM sysobjects 
WHERE id IN ( SELECT id 
              FROM syscolumns 
              WHERE name like '%column_name%' )
66
cichy

Si vous utilisez davantage les outils tiers, vous disposez de nombreuses options, telles que:

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

61
Dwoolk
select  
        s.[name]            'Schema',
        t.[name]            'Table',
        c.[name]            'Column',
        d.[name]            'Data Type',
        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%'

Ceci vous donnera un peu plus d’informations sur le schéma, les tables et les colonnes sur lesquelles vous pouvez choisir ou non d’utiliser des conditions supplémentaires dans votre clause where pour filtrer. Par exemple, si vous ne voulez voir que les champs qui doivent avoir des valeurs, ajoutez

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 afin qu'il soit facile de réorganiser, de supprimer, de renommer ou d'en 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.

48
Francis Rodgers

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

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

Si vous voulez aussi le nom de schéma (ce qui dans de nombreux cas, comme vous aurez beaucoup de schémas différents, et à moins que vous ne puissiez vous souvenir de chaque table de la base de données et de son emplacement 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à où 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 aussi 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 est à noter que la fonctionnalité concat a été ajoutée en 2012. Pour + 2008r2 et les versions antérieures, utilisez + pour concaténer des chaînes.

J'ai un peu reformaté le proc depuis que j'ai posté ceci. C'est un peu plus avancé maintenant mais ça a l'air beaucoup plus salissant (mais c'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 d'effectuer une recherche dans une base de données. Modifiez la décleration de @db de 'master' selon 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
38
Ste Bov
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 de Pinal Sir Blog

25
shadab shah

Vous pouvez le trouver à partir de INFORMATION_SCHEMA.COLUMNS par le filtre nom_colonne 

Select DISTINCT TABLE_NAME as TableName,COLUMN_NAME as ColumnName
     From INFORMATION_SCHEMA.COLUMNS Where column_name like '%myname%'
22
Munavvar
SELECT COLUMN_NAME, TABLE_NAME
  FROM INFORMATION_SCHEMA.COLUMNS    
 WHERE COLUMN_NAME LIKE '%myName%'
20
Neil Knight
SELECT  [TABLE_NAME] ,
        [INFORMATION_SCHEMA].COLUMNS.COLUMN_NAME
FROM    INFORMATION_SCHEMA.COLUMNS
WHERE   INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME LIKE '%NAME%' ;
20
Ritesh Varma-MCA

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%'
16
Shaikh Farooque

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

SELECT COLUMN_NAME, TABLE_NAME, TABLE_SCHEMA
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE COLUMN_NAME LIKE '%col_Name%'
14
Kaleab

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;

Ne changez que YourDatbaseName dans votre base de données et YourcolumnName sur votre nom de colonne que vous recherchez, restez tel quel.

J'espère que cela a aidé

12
Alz
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
8
Mauro Bilotti

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%'
7
Rainhider

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 habituellement le cas). nécessaire pour que je supprime ensuite les informations relatives à l’id du nom de la colonne que je cherche):

  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 * de" par "Supprimer de" et cela me permet de supprimer toute référence à cet ID donné! Ecrivez ces résultats dans un fichier afin que vous les avoir juste au cas où.

NOTE **** Assurez-vous d'éliminer toutes les tables de bakup avant d'exécuter votre instruction delete ... 

  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%'
6
Dan B
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;
6
PedroSouki

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

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

Juste pour améliorer les réponses ci-dessus, j'ai également inclus les 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];
3
Stephen Brett

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%'
3
soheila sadeghian
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
2
Joby

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'
0
Janey