2010-09-21 6 views
16

Je fais du travail de reconnaissance et je dois parcourir quelques centaines de tables de base de données SQL Server pour trouver des colonnes.SQL Server recherche une colonne par son nom

Existe-t-il un moyen de rechercher facilement des colonnes dans la base de données et de renvoyer uniquement le nom de la table à laquelle la colonne appartient?

Je trouve this, mais que retourne aussi des procédures stockées avec ce nom de colonne en elle ...

Répondre

34
SELECT OBJECT_NAME(object_id) FROM sys.columns WHERE name = 'foo' 

Cela inclut des vues bien mais peut encore être filtré. Cela peut être utile cependant.

... Plus généralement

SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'foo' 

sys.columns

+0

Cela fonctionne très bien, j'accepte la réponse lorsque le système me le permet ... – EJC

2
select c.name as ColumnName, o.name as TableName 
from sys.columns c 
inner join sys.objects o on c.object_id = o.object_id 
where c.name = 'MyColumnName' 
0
select table_name from information_schema.columns 
where column_name = '<your column name here>' 

En utilisant les vues information_schema est des bases de données « plus correcte » que les détails du système dans le système sont susceptibles d'être modifiées entre les implémentations de SQL Server.

+0

Pourquoi auriez-vous DISTINCT lorsque les noms de colonnes doivent être uniques dans un tableau? – gbn

+0

J'avais l'étrange impression que le nom de la table pouvait apparaître plusieurs fois (surtout si vous avez plusieurs bases de données avec des schémas similaires, et ne limitez pas votre requête à un schéma ou une base de données spécifique). Avec le recul, le distinct est probablement inutile dans la plupart des contextes. – Kilanash

6

Pour obtenir le

1) Nom de la colonne complète
2) Nom d'objet (y compris le schéma)
3) type d'objet (table/vue)
4) type de données (format agréable: varchar (6) ou numérique (5,2), etc.)
5) null/null non
6) des informations sur l'identité, contrainte de vérification et défaut d'information

essayez ceci:

DECLARE @Search varchar(200) 
SET @Search='YourColumnName' --can be a partial or a complete name 

SELECT 
    s.name as ColumnName 
     ,sh.name+'.'+o.name AS ObjectName 
     ,o.type_desc AS ObjectType 
     ,CASE 
      WHEN t.name IN ('char','varchar') THEN t.name+'('+CASE WHEN s.max_length<0 then 'MAX' ELSE CONVERT(varchar(10),s.max_length) END+')' 
      WHEN t.name IN ('nvarchar','nchar') THEN t.name+'('+CASE WHEN s.max_length<0 then 'MAX' ELSE CONVERT(varchar(10),s.max_length/2) END+')' 
      WHEN t.name IN ('numeric') THEN t.name+'('+CONVERT(varchar(10),s.precision)+','+CONVERT(varchar(10),s.scale)+')' 
      ELSE t.name 
     END AS DataType 

     ,CASE 
      WHEN s.is_nullable=1 THEN 'NULL' 
      ELSE 'NOT NULL' 
     END AS Nullable 
     ,CASE 
      WHEN ic.column_id IS NULL THEN '' 
      ELSE ' identity('+ISNULL(CONVERT(varchar(10),ic.seed_value),'')+','+ISNULL(CONVERT(varchar(10),ic.increment_value),'')+')='+ISNULL(CONVERT(varchar(10),ic.last_value),'null') 
     END 
     +CASE 
      WHEN sc.column_id IS NULL THEN '' 
      ELSE ' computed('+ISNULL(sc.definition,'')+')' 
     END 
     +CASE 
      WHEN cc.object_id IS NULL THEN '' 
      ELSE ' check('+ISNULL(cc.definition,'')+')' 
     END 
      AS MiscInfo 
    FROM sys.columns       s 
     INNER JOIN sys.types     t ON s.system_type_id=t.system_type_id and t.is_user_defined=0 
     INNER JOIN sys.objects     o ON s.object_id=o.object_id 
     INNER JOIN sys.schemas    sh on o.schema_id=sh.schema_id 
     LEFT OUTER JOIN sys.identity_columns ic ON s.object_id=ic.object_id AND s.column_id=ic.column_id 
     LEFT OUTER JOIN sys.computed_columns sc ON s.object_id=sc.object_id AND s.column_id=sc.column_id 
     LEFT OUTER JOIN sys.check_constraints cc ON s.object_id=cc.parent_object_id AND s.column_id=cc.parent_column_id 
    WHERE s.name LIKE '%'[email protected]+'%' 
Questions connexes