Encontre todas as tabelas que contêm colunas com nome especificado - MS SQL Server

1202

É possível consultar nomes de tabelas que contenham colunas sendo

LIKE '%myName%'

?

gruber
fonte
12
Existe um plugin incrível para o servidor sql, que pode procurar todos os tipos de objetos. sql search red-gate.com/products/sql-development/sql-search
Vbp:
1
@vbp: sql-busca é realmente grande, mas como muitas ferramentas, ele não funciona com o SQL Server 2000 (sim, eu estou preso com que no momento: - /)
Patrick Honorez
2
Pesquisa @vbp ApexSQL para SSMS ofertas ainda mais
Junchen Liu

Respostas:

1851

Tabelas de Pesquisa:

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;

Tabelas e exibições de pesquisa:

SELECT      COLUMN_NAME AS 'ColumnName'
            ,TABLE_NAME AS  'TableName'
FROM        INFORMATION_SCHEMA.COLUMNS
WHERE       COLUMN_NAME LIKE '%MyName%'
ORDER BY    TableName
            ,ColumnName;
AdaTheDev
fonte
17
As INFORMATION_SCHEMA exibições anteriores incluídas no SQL Server estão em conformidade com a definição padrão ISO para o arquivo Information_SCHEMA . , sys.columns, sys.tablesÉ específico do Microsoft SQL Server.
Tomasito 18/03/2014
4
Incluir TABLE_SCHEMAna sua lista de seleção pode ser útil. Ainda +1 porque é uma boa resposta.
Bernhard Hofmann
1
Você pode adicionar a explicação das diferenças entre os dois à sua resposta, como comentado por @ user3185569?
Ryan Gates
1
O segundo também funciona com o SQL Server 2000, se você precisar usá-lo #
Patrick Honorez 27/16/16
1
obter um Scheman tabela também: SELEÇÃO c.name AS ColName, t.name AS TableName, SCHEMA_NAME (t.schema_id) AS SchemaName ....
Skorunka František
327

Também podemos usar a seguinte sintaxe: -

select * from INFORMATION_SCHEMA.COLUMNS 
where COLUMN_NAME like '%clientid%' 
order by TABLE_NAME
Khwaza Bandenawaz
fonte
10
Isso funcionou para mim e a principal resposta não (estou usando o MariaDB).
Aubrey Robertson
3
Não é de estranhar que funciona em todos os bancos de dados diferentes, uma vez que INFORMATION_SCHEMAfaz parte do padrão 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');
  • SIMPLES ASSIM!! (SQL, PL / SQL)
    Uso TODO o tempo para encontrar TODAS as instâncias de um nome de coluna em um determinado banco de dados (esquema).
Todd-ECU
fonte
4
Eu copiar e colar este SQL realmente muitas vezes, graças @Todd_ECU
jonaglon
1
Esta deve realmente ser a resposta aceita. Você não precisa realizar junções, o que torna muito mais fácil do que a resposta aceita
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%'

Isso aqui fornecerá algumas informações extras sobre o esquema, tabelas e colunas nas quais você pode ou não optar por usar condições extras na cláusula where para filtrar. Por exemplo, se você deseja apenas ver os campos que devem ter valores, adicione

and c.is_nullable = 0

Você pode adicionar outros condicionais. Também adicionei as colunas na cláusula select dessa maneira vertical, para que fosse fácil reordenar, remover, renomear ou adicionar outros com base em suas necessidades. Como alternativa, você pode procurar apenas tabelas usando T.Name. É muito personalizável.

Aproveitar.

Francis Rodgers
fonte
3
d. [max_length] parece um pouco inútil. c. [max_length] é talvez o que você quis dizer. Mas ainda tenho votos por me levar até lá.
user1566694
você pode colocar isso no final da sua consulta 🤫 "ORDER BY t.name"
Fuat
Usuário cuidado. A consulta acima implica acesso ao objeto 'sys' que nem sempre é verdadeiro. No meu caso, por exemplo, essa consulta não retornou nada. Em vez disso, o uso do 'INFORMATION_SCHEMA' funcionou como um encanto.
OrizG 24/04
85

Isso deve funcionar:

SELECT name 
FROM sysobjects 
WHERE id IN ( SELECT id 
              FROM syscolumns 
              WHERE name like '%column_name%' )
cichy
fonte
6
Eu usaria sys.tablesem vez de sysobjects(que é obsoleto a partir do SQL Server 2005)
marc_s
3
Nome de coluna inválido 'id'
JSON
62

Se você gosta mais de ferramentas de terceiros, existem muitas opções, como:

Isso é muito útil se o seu banco de dados contiver objetos criptografados (visualizações, procedimentos, funções), porque você não poderá procurar facilmente por essas tabelas de sistema.

Dwoolk
fonte
46

Não sei por que tantos de vocês sugerindo se unir a sys.table with sys.columns você podem simplesmente usar o código abaixo:

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

ou

Se você quiser o nome do esquema também:

Select * from  INFORMATION_SCHEMA.COLUMNS
where COLUMN_NAME LIKE '%MyName%'
user3583912
fonte
1
Eles estão recebendo o nome do esquema em sys.tables, talvez isso não seja um problema para você, mas é para muitas pessoas.
K Kimble
Olá, mas ainda não é necessário associar-se ao sys.objects para o nome do esquema, você pode usar Select * from INFORMATION_SCHEMA.COLUMNS em que COLUMN_NAME
CURTA
É bom que você aponte o arquivo INFORMA_SCHEMA.COLUMNS; no entanto, se você executar o EXEC sp_helptext INFORMATION_SCHEMA.COLUMNS, poderá ver que ele realmente faz a mesma coisa e muitas outras coisas inúteis que talvez você não precise.
K Kimble
40

Se você simplesmente deseja o nome da tabela, pode executar:

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

Se você quiser o nome do esquema também (o que, em muitos casos, será necessário, pois você terá muitos esquemas diferentes e, a menos que se lembre de todas as tabelas do banco de dados e de onde ele pertence, isso pode ser útil), execute:

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

e, finalmente, se você quiser em um formato melhor (embora seja aqui que o código (na minha opinião) esteja ficando muito complicado para facilitar a escrita):

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

note que você também pode criar uma função com base no que eu tenho:

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 ressaltar que o recurso concat foi adicionado em 2012. Para 2008r2 e versões anteriores, use + para concatenar seqüências de caracteres.

Re-formatei o proc um pouco desde que publiquei isso. É um pouco mais avançado agora, mas parece muito mais confuso (mas está em um processo para que você nunca o veja) e está formatado melhor.

Esta versão permite que você o tenha em um banco de dados administrativo e pesquise em qualquer banco de dados. Altere a decleração de @dbde 'master'para o que você deseja que seja o banco de dados padrão (NOTA: o uso da função CONCAT () funcionará apenas com 2012+, a menos que você altere a concatenação de cadeias para usar os +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
fonte
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; 

É de Pinal Sir Blog

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

Você pode encontrá-lo em Information_SCHEMA.COLUMNS pelo filtro column_name

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

A consulta a seguir fornecerá os nomes exatos da tabela do banco de dados com o nome do campo como '% myName'.

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

Para obter informações completas: nome da coluna, nome da tabela e esquema da tabela.

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

Eu apenas tentei e isso funciona perfeitamente

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;

Apenas altere YourDatbaseName para o banco de dados e YourcolumnName para o nome da coluna que você procura, mantendo-o como está.

Espero que isso tenha ajudado

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

Eu usei isso para o mesmo propósito e funcionou:

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

Espero que não seja uma resposta duplicada, mas o que eu gosto de fazer é gerar uma instrução sql dentro de uma instrução sql que me permita pesquisar os valores que estou procurando (não apenas as tabelas com esses nomes de campo (como geralmente necessário excluir todas as informações relacionadas ao ID do nome da coluna que estou procurando):

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

Então eu posso copiar e colar e executar minha primeira coluna "SQLToRun" ... então substituo o "Select * from 'por' Delete from 'e isso permite que eu exclua todas as referências a esse ID fornecido! Escreva esses resultados no arquivo para que você tê-los apenas no caso.

NOTA **** Certifique-se de eliminar as tabelas de bakup antes de executar sua instrução de exclusão ...

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

Como o oracle, você pode encontrar tabelas e colunas com isso:

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

Eu queria algo para tabelas e visualizações que não fizessem meus olhos sangrarem.

Inquerir

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
MarredCheese
fonte
4

Apenas para melhorar as respostas acima, incluí visualizações e concatenamos o esquema e a tabela / exibição juntos, tornando os resultados mais aparentes.

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

Você pode tentar 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
fonte
1
Parece muito semelhante a blog.sqlauthority.com/2008/08/06/… pode ajudar na explicação, se nada mais.
user3428422
4

Aqui está a resposta para sua pergunta

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
fonte
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
fonte
Era isso que eu procurava, uma solução em QUALQUER banco de dados, não apenas um.
Fandango68
0

Aqui está uma solução funcional para um banco de dados Sybase

select 
  t.table_name, 
  c.column_name 
from 
  systab as t key join systabcol as c 
where 
   c.column_name = 'MyColumnName'
Janey
fonte
2
Não funcionou. Sintaxe incorreta perto da palavra-chave 'chave'.
Paiman Samadian
0

Podemos usar sp_columnspara esse fim.

sp_columns 'table name', null, null, '%column name%'
Sheikh Abdul Wahid
fonte
0

Consulta SQL para mostrar todas as tabelas que especificaram o nome da coluna:

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
fonte