Buscar todas las tablas que contienen la columna con el nombre especificado - MS SQL Server

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

LIKE '%myName%'

?

preguntado el 31 de enero de 11 a las 07:01

Hay un complemento increíble para el servidor SQL que puede buscar todos los tipos de objetos. búsqueda sql red-gate.com/products/sql-development/sql-search -

@vbp: sql-search es realmente genial, pero como muchas herramientas, no funciona con SQL Server 2000 (sí, estoy atascado con eso en este momento: - /) -

@vbp La búsqueda de ApexSQL para SSMS ofrece aún más:

30 Respuestas

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;

Respondido el 19 de enero de 21 a las 09:01

@Retro INFORMATION_SCHEMA Las vistas incluidas en SQL Server cumplen con la definición estándar ISO para INFORMATION_SCHEMA., sys.columns, sys.tables es específico de Microsoft Sql Server. - Tomásito

Incluye TABLE_SCHEMA en su lista de selección puede ser útil. Todavía +1 porque es una buena respuesta. - bernhard hofmann

¿Puede agregar la explicación de las diferencias entre los dos a su respuesta como lo comentó @ user3185569? - ryan puertas

El segundo también funciona con SQL Server 2000, si tiene que usarlo: patricio honorez

obtener un esquema de tabla también: SELECT c.name AS ColName, t.name AS TableName, SCHEMA_NAME (t.schema_id) AS SchemaName .... - Skorunka Frantisek

También podemos utilizar la siguiente sintaxis: -

select * from INFORMATION_SCHEMA.COLUMNS 
where COLUMN_NAME like '%clientid%' 
order by TABLE_NAME

Respondido 02 Oct 14, 07:10

Esto funcionó para mí y la respuesta principal no (estoy usando MariaDB). - aubrey robertson

No es sorprendente que funcione en todas esas bases de datos diferentes dado que INFORMATION_SCHEMA es parte del Norma ANSI - Davos

Es mejor usar INFORMATION_SCHEMA para estas tareas, no recomendaría tocar las tablas sys por ningún motivo. - Robert Sherman

Esto me funciona en una versión antigua de SQL Server. +1 - Noé Broyles

Servidor 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');
  • ¡¡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 determinada (esquema).

respondido 14 mar '19, 06:03

Copio y pego este SQL muy a menudo, gracias @Todd_ECU - Jonaglon

Esta debería ser realmente la respuesta aceptada. No tiene que realizar uniones, lo que lo hace mucho más fácil que la respuesta aceptada: Cañón de Kolob

La respuesta ejemplar, ¡me ayuda mucho! - Ashish Mishra

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 le dará un poco de información adicional sobre el esquema, las tablas y las columnas que puede o no elegir para 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 de selección de esta manera vertical para que fuera fácil reordenar, eliminar, renombrar o agregar otros según sus necesidades. Alternativamente, puede buscar solo tablas usando T.Name. Es muy personalizable.

¡A disfrutar!

contestado el 24 de mayo de 19 a las 20:05

d. [max_length] parece un poco inútil. c. [max_length] es quizás lo que quisiste decir. Pero aún así, vota por llevarme allí. - user1566694

puede poner esto al final de su consulta 🤫 "ORDER BY t.name" - Fuat

Cuidado con el usuario. La consulta anterior implica acceso al objeto 'sys' que no siempre es cierto. En mi caso, por ejemplo, esa consulta no devolvió nada. En cambio, el uso de 'INFORMATION_SCHEMA' funcionó a las mil maravillas. - OrizG

Por lo general, con los indicadores 1 es verdadero y 0 es falso. El indicador is_nullable también funciona así. Las columnas que "pueden ser nulas", es decir, is_nullable, se marcan con un 1 y las columnas que "no pueden ser nulas" ... es decir, is_nullable es falso, se marcan con un valor 0. Es algo interesante para envolver mi mente .. - alan f

también puede cambiar sys.tables por sys.views si está interesado en columnas de solo vistas .. - alan f

Esto debería funcionar:

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

Respondido 02 Oct 14, 07:10

yo usaría sys.tables en lugar de sysobjects (que está en desuso a partir de SQL Server 2005) - marc_s

Nombre de columna no válido 'id' - JSON

JSON. Estoy trabajando normalmente en SQL Server 2019 - HOANG LARGO

Si le gustan más las herramientas de terceros, existen muchas opciones, como:

Estos son muy útiles si su base de datos contiene objetos encriptados (vistas, procedimientos, funciones) porque no puede buscarlos fácilmente usando tablas del sistema.

respondido 16 nov., 16:20

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

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

or

Si también desea un nombre de esquema:

Select * from  INFORMATION_SCHEMA.COLUMNS
where COLUMN_NAME LIKE '%MyName%'

Respondido 25 Feb 15, 00:02

Obtienen el nombre de esquema de sys.tables, tal vez eso no sea un problema para usted, pero lo es para mucha gente. - k kimble

Hola, pero todavía no es necesario unirse con sys.objects para el nombre del esquema, puede usar Seleccionar * de INFORMATION_SCHEMA.COLUMNS donde COLUMN_NAME LIKE '% MyName%' - user3583912

Es bueno que señale INFORMATION_SCHEMA.COLUMNS; sin embargo, si ejecuta EXEC sp_helptext INFORMATION_SCHEMA.COLUMNS, puede ver que de hecho hace lo mismo, y muchas otras cosas inútiles que quizás no necesite. - k kimble

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 en la base de datos y 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 desea en un formato más agradable (aunque aquí es donde el código (en mi opinión) se está volviendo demasiado complicado para escribirlo fácilmente):

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 vuelto a formatear el proceso un poco desde que publiqué esto. Es un poco más avanzado ahora, pero parece mucho más complicado (pero está en proceso, por lo que nunca lo verá) y está mejor formateado.

Esta versión le permite tenerlo en una base de datos administrativa y luego buscar en cualquier base de datos. Cambiar la declinación de @db del 'master' a la que desee que sea la base de datos predeterminada (NOTA: el uso de la función CONCAT () solo funcionará con 2012+ a menos que cambie la concatenación de cadenas para usar la + 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

Respondido 08 ago 17, 07:08

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 de Pinal Sir Blog

Respondido 06 Jul 12, 10:07

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

respondido 11 mar '20, 05:03

tan impresionante, gracias - ebrahim karimi

SELECT COLUMN_NAME, TABLE_NAME
  FROM INFORMATION_SCHEMA.COLUMNS    
 WHERE COLUMN_NAME LIKE '%myName%'

Respondido el 31 de enero de 11 a las 10:01

Puede encontrarlo en INFORMATION_SCHEMA.COLUMNS por filtro column_name

Select DISTINCT TABLE_NAME as TableName,COLUMN_NAME as ColumnName
     From INFORMATION_SCHEMA.COLUMNS Where column_name like '%myname%'

respondido 30 nov., 16:08

Para obtener información completa: nombre de la columna, nombre de la tabla y esquema de la tabla.

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

Respondido 01 ago 16, 15:08

La siguiente consulta le dará los nombres exactos de la tabla de la base de datos que tiene un nombre de campo como '% myName'.

SELECT distinct(TABLE_NAME)
  FROM INFORMATION_SCHEMA.COLUMNS    
 WHERE COLUMN_NAME LIKE '%myName%'

Respondido el 21 de enero de 13 a las 13:01

SELECT  [TABLE_NAME] ,
        [INFORMATION_SCHEMA].COLUMNS.COLUMN_NAME
FROM    INFORMATION_SCHEMA.COLUMNS
WHERE   INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME LIKE '%NAME%' ;

respondido 18 nov., 13:09

En la base de datos de MS SQL Server, utilice esta consulta para obtener las tablas y los nombres de las columnas respectivas que contienen el texto de entrada:

SELECT t.name AS tableName, c.name AS columnName 
FROM sys.tables as t 
INNER JOIN sys.columns AS c ON t.object_id=c.object_id 
WHERE c.name LIKE '%<your_search_string>%'

Respondido 26 Jul 20, 18:07

Lo acabo de probar y 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 manténgalo como está.

Espero que esto haya ayudado

Respondido 10 Jul 14, 06:07

Yo quería algo para tablas y vistas eso no me hizo 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

respondido 02 mar '20, 21:03

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

respondido 14 mar '14, 14:03

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

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

Respondido el 23 de junio de 15 a las 15:06

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;

Respondido 13 ago 15, 14:08

Como Oracle, puedes encontrar tablas y columnas con esto:

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

respondido 03 nov., 15:13

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

Respondido el 14 de enero de 17 a las 13:01

Parece muy similar a blog.sqlauthority.com/2008/08/06/… puede ayudar con una explicación al menos. - user3428422

Con suerte, esta no es una respuesta duplicada, pero lo que me gusta hacer es generar una declaración sql dentro de una declaración sql que me permitirá 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 el "Seleccionar * de 'con' Eliminar de 'y me permite eliminar cualquier referencia a esa ID dada. Escriba estos resultados en el archivo para que tenlos 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%'

Respondido el 26 de junio de 14 a las 22:06

      SELECT   TABLE_SCHEMA +'.'+ TABLE_NAME, COLUMN_NAME   
      FROM [yourdatabase].INFORMATION_SCHEMA.COLUMNS
      WHERE COLUMN_NAME LIKE '%myName%'

Esto le dará el nombre de la tabla de la columna que necesita encontrar.

contestado el 11 de mayo de 21 a las 06:05

Solo para mejorar las respuestas anteriores, también he incluido Vistas y concatenado el esquema y la tabla / vista 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];

Respondido 04 ago 15, 11:08

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

Respondido el 29 de junio de 16 a las 13:06

Esto era lo que estaba buscando, una solución en CUALQUIER base de datos, no solo en una. - fandango68

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'

Respondido 28 Feb 20, 06:02

En MS SQL, puede escribir la siguiente línea para verificar los nombres de columna de una tabla en particular:

sp_help your_tablename

O, primero puede seleccionar el nombre de su tabla en las ventanas de consulta (resalte el esquema y el nombre de la tabla) y luego presione la combinación de teclas a continuación:

Alt + F1

Respondido el 31 de diciembre de 20 a las 10:12

Bueno, eso es genial. Siempre es bueno cuando la respuesta de un niño de 12 años es tan útil. - Wade Hatler

Aquí hay una solución funcional 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'

Respondido 04 Jul 18, 16:07

No funcionó. Sintaxis incorrecta cerca de la palabra clave 'clave'. - paiman samadian

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.