2010-09-21 46 views
16

Tôi đang thực hiện một số công việc khôi phục và phải đào qua vài trăm bảng cơ sở dữ liệu SQL Server để tìm các cột.Máy chủ SQL tìm kiếm một cột theo tên

Có cách nào để dễ dàng tìm kiếm các cột trong cơ sở dữ liệu và chỉ trả lại tên bảng mà cột đó thuộc về?

tôi thấy this, nhưng điều đó lợi nhuận cũng lưu trữ các thủ tục với tên cột trong nó ...

Trả lời

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

này có tầm nhìn ra dù nhưng có thể được lọc thêm. Nó có thể hữu ích mặc dù.

Tổng quát hơn ...

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

sys.columns

+0

Công trình này tuyệt vời, tôi sẽ chấp nhận câu trả lời khi hệ thống cho phép ... – 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>' 

Sử dụng các quan điểm information_schema là 'đúng hơn' như các chi tiết hệ thống trong hệ thống cơ sở dữ liệu có thể thay đổi giữa hiện thực của SQL Server.

+0

Tại sao bạn có DISTINCT khi tên cột phải là duy nhất trong bảng? – gbn

+0

Tôi đã có ấn tượng kỳ lạ rằng tên bảng có thể hiển thị nhiều lần (đặc biệt nếu bạn có nhiều cơ sở dữ liệu với các lược đồ tương tự và không hạn chế truy vấn của bạn vào một lược đồ hoặc cơ sở dữ liệu cụ thể). Trong tầm nhìn xa, sự khác biệt có lẽ là vô ích trong hầu hết các bối cảnh. – Kilanash

6

Để có được

1) tên cột đầy đủ
2) tên đối tượng (trong đó có schema)
3) loại đối tượng (bảng/xem)
4) kiểu dữ liệu (định dạng đẹp: varchar (6) hoặc số (5,2), vv)
5) null/không null
6) thông tin về danh tính, kiểm tra ràng buộc, và thông tin mặc định

thử điều này:

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]+'%' 
Các vấn đề liên quan