É possível consultar nomes de tabelas que contenham colunas sendo
LIKE '%myName%'
?
É possível consultar nomes de tabelas que contenham colunas sendo
LIKE '%myName%'
?
Respostas:
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;
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.
TABLE_SCHEMA
na sua lista de seleção pode ser útil. Ainda +1 porque é uma boa resposta.
Também podemos usar a seguinte sintaxe: -
select * from INFORMATION_SCHEMA.COLUMNS
where COLUMN_NAME like '%clientid%'
order by TABLE_NAME
INFORMATION_SCHEMA
faz parte do padrão ANSI
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');
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.
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.
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%'
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 @db
de '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
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
SELECT COLUMN_NAME, TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%myName%'
SELECT [TABLE_NAME] ,
[INFORMATION_SCHEMA].COLUMNS.COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME LIKE '%NAME%' ;
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%'
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
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
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%'
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;
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
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];
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%'
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
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'
Podemos usar sp_columns
para esse fim.
sp_columns 'table name', null, null, '%column name%'