2012-08-17 35 views
5

Chỉ cần tự hỏi cách liệt kê tên cột và tên bảng trong một truy vấn cho một dạng xem.Cách liệt kê tên bảng nguồn của cột trong một VIEW (SQL Server 2005)

Ví dụ:

Một quan điểm đặt tên như viewC, tạo bởi tbl1 inner join tbl2, chứa a,b,c,d cột (a,b từ tbl1c,d từ tbl2).

Làm thế nào để

Select COLUMN_NAME, DATA_TYPE, column_default, character_maximum_length, sourceTableNAME 
FROM information_schema.columns 
where table_name='viewC' 

với nhau?

Trả lời

8

Thông tin này có sẵn từ INFORMATION_SCHEMA lần xem:

SELECT * 
FROM INFORMATION_SCHEMA.VIEW_COLUMN_USAGE AS cu 
JOIN INFORMATION_SCHEMA.COLUMNS AS c 
ON  c.TABLE_SCHEMA = cu.TABLE_SCHEMA 
AND  c.TABLE_CATALOG = cu.TABLE_CATALOG 
AND  c.TABLE_NAME = cu.TABLE_NAME 
AND  c.COLUMN_NAME = cu.COLUMN_NAME 
WHERE cu.VIEW_NAME = '<your view name>' 
AND  cu.VIEW_SCHEMA = '<your view schema>' 

Nếu nhìn của bạn bao gồm các bảng từ nhiều hơn một cơ sở dữ liệu, truy vấn sẽ trở thành phức tạp hơn nhiều

+2

Điều này hiển thị tên cột và tên bảng có. Nhưng không gieo tên bí danh được yêu cầu trong trường hợp của tôi. –

+0

Có ai có thể tìm ra truy vấn để xem tên bí danh cột xem gắn với tên cột của bảng bên dưới không? – AS91

1

Hãy thử điều này:

SELECT * FROM INFORMATION_SCHEMA.VIEW_COLUMN_USAGE AS VCU 
JOIN INFORMATION_SCHEMA.COLUMNS AS COL 
ON COL.TABLE_SCHEMA = VCU.TABLE_SCHEMA 
AND COL.TABLE_CATALOG = VCU.TABLE_CATALOG 
AND COL.TABLE_NAME = VCU.TABLE_NAME 
AND COL.COLUMN_NAME = VCU.COLUMN_NAME 
WHERE VCU.VIEW_NAME = 'ViewName' 

See this SQLFiddle

0

Tôi đã có một cái nhìn (SQL Server 2012) mà đọc từ cơ sở dữ liệu khác và đã có một UNION là tốt. Các truy vấn trên không có tác dụng đối với tôi, vì vậy tôi đã quyết định sử dụng Profiler để kiểm tra cách SSMS truy xuất thông tin. Đây là những gì tôi đã kết thúc với:

SELECT 
    clmns.name AS [Name] 
    ,usrt.name AS [DataType] 
    ,CAST(CASE WHEN baset.name IN (N'nchar', N'nvarchar') AND clmns.max_length <> -1 THEN clmns.max_length/2 ELSE clmns.max_length END AS int) AS [Length] 
    ,CAST(clmns.precision AS int) AS [NumericPrecision] 
    ,CAST(clmns.scale AS int) AS [NumericScale] 
    ,clmns.column_id AS [ID] 
FROM sys.all_views AS v 
INNER JOIN sys.all_columns AS clmns 
    ON clmns.object_id=v.object_id 
LEFT OUTER JOIN sys.indexes AS ik 
    ON ik.object_id = clmns.object_id 
    AND 1=ik.is_primary_key 
LEFT OUTER JOIN sys.types AS usrt 
    ON usrt.user_type_id = clmns.user_type_id 
LEFT OUTER JOIN sys.types AS baset 
    ON (baset.user_type_id = clmns.system_type_id AND baset.user_type_id = baset.system_type_id) 
    OR ((baset.system_type_id = clmns.system_type_id) AND (baset.user_type_id = clmns.user_type_id) AND (baset.is_user_defined = 0) AND (baset.is_assembly_type = 1)) 
LEFT OUTER JOIN sys.xml_schema_collections AS xscclmns 
    ON xscclmns.xml_collection_id = clmns.xml_collection_id 
WHERE v.[type] = 'V' 
    AND v.name ='<your view name>' 
    AND SCHEMA_NAME(v.schema_id)='<your schema name>' 
ORDER BY [ID] ASC 
Các vấn đề liên quan