Encuentra todas las tablas que contienen columnas con el nombre especificado - MS SQL Server

1202

¿Es posible consultar los nombres de tablas que contienen columnas siendo

LIKE '%myName%'

?

gruber
fuente
12
Hay un complemento increíble para el servidor SQL que puede buscar todos los tipos de objetos. sql search red-gate.com/products/sql-development/sql-search
Vbp
1
@vbp: sql-search es genial, pero como muchas herramientas, no funciona con SQL Server 2000 (sí, estoy atascado con eso en este momento: - /)
Patrick Honorez
2
@vbp La búsqueda de ApexSQL para SSMS ofrece aún más
Junchen Liu

Respuestas:

1851

Tablas de búsqueda:

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;

Buscar tablas y vistas:

SELECT      COLUMN_NAME AS 'ColumnName'
            ,TABLE_NAME AS  'TableName'
FROM        INFORMATION_SCHEMA.COLUMNS
WHERE       COLUMN_NAME LIKE '%MyName%'
ORDER BY    TableName
            ,ColumnName;
AdaTheDev
fuente
17
Las INFORMATION_SCHEMA vistas @Revious incluidas en SQL Server cumplen con la definición estándar ISO para el INFORMATION_SCHEMA. , sys.columns, sys.tablesQue es específico de Microsoft SQL Server.
Tomasito
44
Incluirlo TABLE_SCHEMAen su lista de selección puede ser útil. Todavía +1 porque es una buena respuesta.
Bernhard Hofmann
1
¿Puede agregar la explicación de las diferencias entre los dos a su respuesta como comentó @ user3185569?
Ryan Gates
1
El segundo también funciona con SQL Server 2000, si tiene que usarlo
Patrick Honorez,
1
obtenga un esquema de tabla también: SELECCIONE c.name AS ColName, t.name AS TableName, SCHEMA_NAME (t.schema_id) AS SchemaName ....
Skorunka František
327

También podemos usar la siguiente sintaxis: -

select * from INFORMATION_SCHEMA.COLUMNS 
where COLUMN_NAME like '%clientid%' 
order by TABLE_NAME
Khwaza Bandenawaz
fuente
10
Esto funcionó para mí y la respuesta principal no (estoy usando MariaDB).
Aubrey Robertson el
3
No es sorprendente que funcione en todas esas bases de datos diferentes dado que INFORMATION_SCHEMAes parte del Estándar ANSI
Davos
181

Servidor SQL:

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

Oráculo:

SELECT owner, table_name, column_name 
FROM all_tab_columns 
WHERE column_name LIKE '%YOUR_COLUMN_NAME%'
AND OWNER IN ('YOUR_SCHEMA_NAME');
  • ¡¡SIMPLE COMO ESO!! (SQL, PL / SQL)
    Lo uso TODO el tiempo para encontrar TODAS las instancias de un nombre de columna en una base de datos (esquema) dada.
Todd-ECU
fuente
44
Copio y pego este SQL muy a menudo, gracias @Todd_ECU
jonaglon
1
Esta realmente debería ser la respuesta aceptada. No tiene que realizar uniones, lo que lo hace mucho más fácil que la respuesta aceptada
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%'

Esto aquí le dará un poco de información adicional sobre el esquema, las tablas y las columnas que puede elegir o no usar condiciones adicionales en su cláusula where para filtrar. Por ejemplo, si solo desea ver los campos que deben tener valores, agregue

and c.is_nullable = 0

Puede agregar otros condicionales, también agregué las columnas en la cláusula select de esta manera vertical, por lo que fue fácil reordenar, eliminar, renombrar o agregar otros según sus necesidades. Alternativamente, puede buscar solo tablas usando T.Name. Es muy personalizable.

Disfrutar.

Francis Rodgers
fuente
3
d. [max_length] parece un poco inútil. c. [max_length] es quizás lo que quisiste decir. Pero todavía vota por llevarme allí.
user1566694
puede poner esto al final de su consulta 🤫 "ORDENAR POR t.name"
Fuat
Cuidado con el usuario. La consulta anterior implica el acceso al objeto 'sys' que no siempre es cierto. En mi caso, por ejemplo, esa consulta no devolvió nada. En cambio, usar el 'INFORMATION_SCHEMA' funcionó de maravilla.
OrizG
85

Esto debería funcionar:

SELECT name 
FROM sysobjects 
WHERE id IN ( SELECT id 
              FROM syscolumns 
              WHERE name like '%column_name%' )
cichy
fuente
66
Lo usaría en sys.tableslugar de sysobjects(que está en desuso a partir de SQL Server 2005)
marc_s
3
Nombre de columna no válido 'id'
JSON
46

No sé por qué tantos de ustedes sugiriendo unirse a sys.table with sys.columns ustedes simplemente pueden usar el siguiente código:

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

o

Si también quieres el nombre del esquema:

Select * from  INFORMATION_SCHEMA.COLUMNS
where COLUMN_NAME LIKE '%MyName%'
usuario3583912
fuente
1
Están recibiendo el nombre del esquema de sys.tables, tal vez eso no sea un problema para usted, pero lo es para mucha gente.
K Kimble
Hola, pero aún no es necesario unirse a sys.objects para el nombre del esquema, puede usar Seleccionar * de INFORMATION_SCHEMA.COLUMNS donde COLUMN_NAME LIKE '% MyName%'
usuario3583912
Es bueno que señales INFORMATION_SCHEMA.COLUMNS, sin embargo, si ejecutas EXEC sp_helptext INFORMATION_SCHEMA.COLUMNS puedes ver que realmente hace lo mismo y muchas otras cosas inútiles que quizás no necesites.
K Kimble
40

Si simplemente desea el nombre de la tabla, puede ejecutar:

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

Si también desea el Nombre del esquema (que en muchos casos lo hará, ya que tendrá muchos esquemas diferentes, y a menos que pueda recordar cada tabla de la base de datos y a dónde pertenece, esto puede ser útil) ejecute:

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

y finalmente si lo quieres en un formato más agradable (aunque aquí es donde el código (en mi opinión) se está volviendo demasiado complicado para una escritura fácil):

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

Tenga en cuenta que también puede crear una función basada en lo que tengo:

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

Vale la pena señalar que la función concat se agregó en 2012. Para 2008r2 y versiones anteriores, use + para concatenar cadenas.

He formateado el proceso un poco desde que publiqué esto. Ahora es un poco más avanzado, pero parece mucho más desordenado (pero está en un proceso, por lo que nunca lo verás) y está formateado mejor.

Esta versión le permite tenerla en una base de datos administrativa y luego buscar en cualquier base de datos. Cambie la declinación de @dbfrom 'master'a la que desee que sea la base de datos predeterminada (NOTA: usar la función CONCAT () solo funcionará con 2012+ a menos que cambie la concatenación de cadenas para usar los +operadores).

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

Es del Blog de Pinal Sir

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

Puede encontrarlo en INFORMATION_SCHEMA.COLUMNS por column_name filter

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

La siguiente consulta le dará los nombres exactos de la tabla de la base de datos con el nombre del campo como '% myName'.

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

Para obtener información completa: nombre de la columna, nombre de la tabla, así como el esquema de la tabla.

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

lo acabo de probar y esto funciona perfectamente

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;

Solo cambie YourDatbaseName a su base de datos y YourcolumnName a su nombre de columna que está buscando, el resto lo mantiene como está.

Espero que esto haya ayudado

Alz
fuente
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
fuente
7

Usé esto para el mismo propósito y funcionó:

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

Espero que esta no sea una respuesta duplicada, pero lo que me gusta hacer es generar una declaración sql dentro de una declaración sql que me permita buscar los valores que estoy buscando (no solo las tablas con esos nombres de campo (como suele ser necesario para que luego elimine cualquier información relacionada con la identificación del nombre de la columna que estoy buscando):

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

Luego puedo copiar y pegar ejecutar mi primera columna "SQLToRun" ... luego reemplazo "Seleccionar * de 'con' Eliminar de 'y me permite eliminar cualquier referencia a esa ID dada. ¡Escriba estos resultados en el archivo para que pueda tenerlos por si acaso.

NOTA **** Asegúrese de eliminar las tablas de bakup antes de ejecutar su declaración de eliminación ...

  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
fuente
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
fuente
6

Al igual que Oracle, puede encontrar tablas y columnas con esto:

select table_name, column_name
from user_tab_columns 
where column_name 
like '%myname%';
Caballero de hielo
fuente
5

Quería algo para mesas y vistas que no me hiciera sangrar los ojos.

Consulta

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]

Resultado

Type        Object   Column
----------------------------
BASE TABLE  Table1   myName1
BASE TABLE  Table2   myName2
VIEW        View1    myName1
VIEW        View2    myName2
Queso Marred
fuente
4

Solo para mejorar las respuestas anteriores, también he incluido Vistas y Concatenado el Esquema y la Tabla / Vista juntos para hacer que los Resultados sean más evidentes.

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
fuente
4

Puedes probar esta consulta:

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
fuente
1
Se ve muy similar a blog.sqlauthority.com/2008/08/06/… puede ayudar con la explicación, si nada más.
user3428422
4

Aqui esta la respuesta a tu pregunta

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
fuente
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
fuente
Esto era lo que estaba buscando, una solución en CUALQUIER base de datos, no solo una.
Fandango68
0

Aquí hay una solución de trabajo para una base de datos Sybase

select 
  t.table_name, 
  c.column_name 
from 
  systab as t key join systabcol as c 
where 
   c.column_name = 'MyColumnName'
Janey
fuente
2
No funcionó. Sintaxis incorrecta cerca de la palabra clave 'clave'.
Paiman Samadian
0

Podemos usar sp_columnspara el propósito.

sp_columns 'table name', null, null, '%column name%'
Jeque Abdul Wahid
fuente
0

Consulta SQL para mostrar todas las tablas que tienen un nombre de columna especificado:

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
fuente