Est-il possible de rechercher des noms de table contenant des colonnes
LIKE '%myName%'
?
Est-il possible de rechercher des noms de table contenant des colonnes
LIKE '%myName%'
?
Réponses:
Tableaux 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;
Rechercher des tableaux et des vues:
SELECT COLUMN_NAME AS 'ColumnName'
,TABLE_NAME AS 'TableName'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%MyName%'
ORDER BY TableName
,ColumnName;
INFORMATION_SCHEMA
vues @Revious incluses dans SQL Server sont conformes à la définition de la norme ISO pour INFORMATION_SCHEMA. , sys.columns
, sys.tables
Est spécifique à Microsoft Sql Server.
TABLE_SCHEMA
dans votre liste de sélection peut être utile. Toujours +1 car c'est une bonne réponse.
Nous pouvons également utiliser la syntaxe suivante: -
select * from INFORMATION_SCHEMA.COLUMNS
where COLUMN_NAME like '%clientid%'
order by TABLE_NAME
INFORMATION_SCHEMA
fait partie de la norme ANSI
Serveur 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');
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%'
Cela vous donnera ici quelques informations supplémentaires sur le schéma, les tables et les colonnes sur lesquelles vous pouvez ou non choisir d'utiliser des conditions supplémentaires dans votre clause where pour filtrer. Par exemple, si vous vouliez seulement voir les champs qui doivent avoir des valeurs ajouter
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 verticale afin qu'il soit facile de réorganiser, supprimer, renommer ou 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 préférez les outils tiers, il existe de nombreuses options telles que:
Celles-ci sont très utiles si votre base de données contient des objets chiffrés (vues, procédures, fonctions) car vous ne pouvez pas facilement les rechercher à l'aide des tables système.
Je ne sais pas pourquoi tant d'entre vous suggérant de se joindre à sys.table with sys.columns
vous peuvent simplement utiliser le code ci-dessous:
Select object_name(object_id) as TableName,* from SYS.columns where name LIKE '%MyName%'
ou
Si vous souhaitez également le nom du schéma:
Select * from INFORMATION_SCHEMA.COLUMNS
where COLUMN_NAME LIKE '%MyName%'
Si vous voulez simplement le nom de la table, vous pouvez l'exécuter:
select object_name(object_id) from sys.columns
where name like '%received_at%'
Si vous voulez également le nom du schéma (ce qui dans de nombreux cas, vous le ferez, car vous aurez beaucoup de schémas différents, et à moins que vous ne vous souveniez de chaque table de la base de données et où il appartient, cela 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à que 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 également 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 convient de noter que la fonction de concaténation a été ajoutée en 2012. Pour 2008r2 et versions antérieures, utilisez + pour concaténer des chaînes.
J'ai reformaté le proc un peu depuis que j'ai posté ça. Il est un peu plus avancé maintenant mais semble beaucoup plus compliqué (mais il 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 de rechercher dans n'importe quelle base de données. Modifiez la décaleration de @db
de 'master'
à 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 du blog de Pinal Sir
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%'
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;
Modifiez uniquement YourDatbaseName en votre base de données et YourcolumnName en nom de colonne que vous recherchez pour le reste, gardez-le 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
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 généralement nécessaire pour que je supprime ensuite toutes les informations relatives à l'ID du nom de colonne que je recherche):
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 * from" par "Delete from" et cela me permet de supprimer toutes les références à cet ID donné! Écrivez ces résultats dans un fichier afin que vous les avoir juste au cas où.
REMARQUE **** Assurez-vous d'éliminer toutes les tables de préparation avant d'exécuter votre instruction de suppression ...
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;
Je voulais quelque chose pour les tableaux et les vues qui ne me faisaient pas saigner.
Requete
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]
Résultat
Type Object Column
----------------------------
BASE TABLE Table1 myName1
BASE TABLE Table2 myName2
VIEW View1 myName1
VIEW View2 myName2
Juste pour améliorer les réponses ci-dessus, j'ai également inclus des 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'
Nous pouvons utiliser sp_columns
à cette fin.
sp_columns 'table name', null, null, '%column name%'