2010-09-21 22 views
16

Estoy haciendo un trabajo de reconocimiento y tengo que buscar entre cientos de tablas de bases de datos de SQL Server para buscar columnas.Búsqueda de SQL Server para una columna por nombre

¿Hay alguna manera de buscar fácilmente columnas en la base de datos y devolver solo el nombre de la tabla a la que pertenece la columna?

He encontrado this, sino que también devuelve los procedimientos almacenados con el nombre de la columna en ella ...

Respuesta

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

Esto incluye puntos de vista, pero aunque se puede filtrar aún más. Sin embargo, puede ser útil.

más general ...

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

sys.columns

+0

Esto funciona muy bien, aceptaré la respuesta cuando el sistema me permita ... – 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>' 

Uso de las vistas INFORMATION_SCHEMA es 'más correcto' como los detalles del sistema en el sistema de bases de datos están sujetas a cambios entre implementaciones de SQL Server.

+0

¿Por qué tendría DISTINCT cuando los nombres de columna deben ser únicos en una tabla? – gbn

+0

Tenía la extraña impresión de que el nombre de la tabla podría aparecer varias veces (especialmente si tiene varias bases de datos con esquemas similares, y no restrinja su consulta a un esquema o base de datos específico). En retrospectiva, lo distinto probablemente sea inútil en la mayoría de los contextos. – Kilanash

6

Para obtener el

1) nombre de la columna completa
2) nombre de objeto (incluyendo esquema)
3) tipo de objeto (tabla/vista)
4) tipo de datos (formato agradable: varchar (6) o numérico (5,2), etc.)/no nula
6) información
5) nula en la identidad, restricción de comprobación, y la información por defecto

intente esto:

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]+'%' 
Cuestiones relacionadas