Est-il possible de rechercher des noms de tables contenant des colonnes
LIKE '%myName%'
?
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;
Nous pouvons également utiliser la syntaxe suivante: -
select * from INFORMATION_SCHEMA.COLUMNS
where COLUMN_NAME like '%clientid%'
order by TABLE_NAME
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');
Cela devrait fonctionner:
SELECT name
FROM sysobjects
WHERE id IN ( SELECT id
FROM syscolumns
WHERE name like '%column_name%' )
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.
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.
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
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
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%'
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%' ;
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%'
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%'
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é
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
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%'
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%'
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;
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%';
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];
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%'
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
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'