2010-09-21 3 views
16

Ich mache einige Recon arbeiten und müssen durch ein paar hundert SQL Server-Datenbanktabellen zu finden Spalten.SQL Server Suche nach einer Spalte nach Name

Gibt es eine Möglichkeit, einfach nach Spalten in der Datenbank zu suchen und nur den Tabellennamen zurückzugeben, zu dem die Spalte gehört?

fand ich this, sondern dass auch Erträge Gespeicherte Prozeduren mit dem Spaltennamen in ihm ...

Antwort

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

Dies obwohl Ansichten enthält aber weiter gefiltert werden kann. Es kann jedoch nützlich sein.

Allgemeiner ...

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

sys.columns

+0

Das funktioniert gut, ich werde die Antwort akzeptieren, wenn das System mir erlaubt ... – 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>' 

die information_schema Ansichten zu verwenden ist ‚richtige‘ als Systemdetails in den Systemdatenbanken unterliegen zwischen Implementierungen von SQL Server ändern.

+0

Warum sollten Sie DISTINCT haben, wenn Spaltennamen in einer Tabelle eindeutig sein müssen? – gbn

+0

Ich hatte den seltsamen Eindruck, dass der Tabellenname mehrere Male angezeigt werden könnte (besonders wenn Sie mehrere Datenbanken mit ähnlichen Schemas haben und Ihre Abfrage nicht auf ein bestimmtes Schema oder eine bestimmte Datenbank beschränken). Im Rückblick ist das distinkte in den meisten Kontexten wahrscheinlich nutzlos. – Kilanash

6

Um die

1) Vollspaltenname
2) Objektnamen (einschließlich Schema)
3) Objekttyp (Tabelle/View)
4) Datentyp (schönes Format zu erhalten: varchar (6) oder numerisch (5,2), etc.)
5) null/nicht null
6) Informationen über die Identität, Constraint überprüfen und Standard-info

versuchen Sie dies:

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]+'%' 
Verwandte Themen