2012-04-06 38 views
11

Giả sử tôi có một cái nhìn trong đó một số tên cột là bí danh, như "họ" trong ví dụ này:Tìm tên cột thực của một bí danh được sử dụng trong chế độ xem?

CREATE VIEW myView AS 
    SELECT 
      firstName, 
      middleName, 
      you.lastName surName 
    FROM 
      myTable me 
      LEFT OUTER JOIN yourTable you 
      ON me.code = you.code 
GO 

Tôi có thể lấy một số thông tin về quan điểm sử dụng các quan điểm INFORMATION_SCHEMA.
Ví dụ, truy vấn

SELECT column_name AS ALIAS, data_type AS TYPE 
FROM information_schema.columns 
WHERE table_name = 'myView' 

sản lượng:

 
---------------- 
|ALIAS  |TYPE | 
---------------- 
|firstName |nchar| 
|middleName|nchar| 
|surName |nchar| 
---------------- 

Tuy nhiên, tôi muốn biết tên cột thực tế là tốt. Lý tưởng nhất là:

 
--------------------------- 
|ALIAS  |TYPE |REALNAME | 
--------------------------- 
|firstName |nchar|firstName | 
|middleName|nchar|middleName| 
|surName |nchar|lastName | 
--------------------------- 

Làm thế nào tôi có thể xác định những gì các tên cột thực tế dựa trên bí danh? Phải có một số cách để sử dụng các bảng sys và/hoặc khung nhìn INFORMATION_SCHEMA để lấy thông tin này.


EDIT: tôi có thể nhận chặt chẽ với sự ghê tởm này, đó là tương tự như Arion của câu trả lời:

SELECT 
    c.name AS ALIAS, 
    ISNULL(type_name(c.system_type_id), t.name) AS DATA_TYPE, 
    tablecols.name AS REALNAME 
FROM 
    sys.views v 
    JOIN sys.columns c ON c.object_id = v.object_id 
    LEFT JOIN sys.types t ON c.user_type_id = t.user_type_id 
    JOIN sys.sql_dependencies d ON d.object_id = v.object_id 
     AND c.column_id = d.referenced_minor_id 
    JOIN sys.columns tablecols ON d.referenced_major_id = tablecols.object_id 
     AND tablecols.column_id = d.referenced_minor_id 
     AND tablecols.column_id = c.column_id 
WHERE v.name ='myView' 

sản lượng này:

 
--------------------------- 
|ALIAS  |TYPE |REALNAME | 
--------------------------- 
|firstName |nchar|firstName | 
|middleName|nchar|middleName| 
|surName |nchar|code  | 
|surName |nchar|lastName | 
--------------------------- 

nhưng kỷ lục thứ ba là sai - điều này xảy ra với bất kỳ chế độ xem nào được tạo bằng cách sử dụng mệnh đề "JOIN", bởi vì có hai cột có cùng cột "column_id", nhưng trong bảng khác nhau S.

+0

afaik, cú pháp thường xuyên cho bí danh cột được sử dụng 'AS': chọn columnA như columnB từ t – abatishchev

+2

Tên thật cho một lượt xem có thể thậm chí không phải là một cột, vì vậy không có cách nào để làm điều này. Tên của cột trong chế độ xem này là gì? Tạo chế độ xem a khi chọn 1 b –

+0

Miễn là tùy chọn ['VIEW_METADATA'] (http://msdn.microsoft.com/en-us/library/ms187956.aspx) không được đặt khi tạo chế độ xem SQL Server sẽ trả về với DB-Library, ODBC và OLE DB API Siêu dữ liệu chế độ duyệt bao gồm thông tin về bảng cơ sở mà các cột trong tập hợp kết quả thuộc về. Không bao giờ nhìn vào khía cạnh này bản thân mình mặc dù. –

Trả lời

12

Với quan điểm này:

CREATE VIEW viewTest 
AS 
SELECT 
    books.id, 
    books.author, 
    Books.title AS Name 
FROM 
    Books 

Những gì tôi có thể thấy bạn có thể nhận được các cột được sử dụng và các bảng sử dụng bằng cách làm này:

SELECT * 
FROM INFORMATION_SCHEMA.VIEW_COLUMN_USAGE AS UsedColumns 
WHERE UsedColumns.VIEW_NAME='viewTest' 

SELECT * 
FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE AS UsedTables 
WHERE UsedTables.VIEW_NAME='viewTest' 

này là dành cho SQL Server 2005 +. Xem tham khảo here

Sửa

Đưa quan điểm tương tự. Hãy thử truy vấn này:

SELECT 
    c.name AS columnName, 
    columnTypes.name as dataType, 
    aliases.name as alias 
FROM 
sys.views v 
JOIN sys.sql_dependencies d 
    ON d.object_id = v.object_id 
JOIN .sys.objects t 
    ON t.object_id = d.referenced_major_id 
JOIN sys.columns c 
    ON c.object_id = d.referenced_major_id 
JOIN sys.types AS columnTypes 
    ON c.user_type_id=columnTypes.user_type_id 
    AND c.column_id = d.referenced_minor_id 
JOIN sys.columns AS aliases 
    on c.column_id=aliases.column_id 
    AND aliases.object_id = object_id('viewTest') 
WHERE 
    v.name = 'viewTest'; 

Nó trả này cho tôi:

columnName dataType alias 

id   int  id 
author  varchar author 
title  varchar Name 

này cũng được thử nghiệm trong sql 2005 +

+0

Điều này thật thú vị, nhưng không có gì tôi có thể thấy trong chế độ xem INFORMATION_SCHEMA.VIEW_COLUMN_USAGE có thể được sử dụng trong một phép nối trên để ánh xạ tới tên bí danh. Trong ví dụ của tôi, các cột được trả về theo thứ tự khác. Đối với INFORMATION_SCHEMA.COLUMNS, có "POSINAL POSITION". Không có may mắn như vậy cho INFORMATION_SCHEMA.VIEW_COLUMN_USAGE. –

+0

Đã cập nhật câu trả lời .. Xem: P – Arion

+0

Cảm ơn, đây là bản chất tôi có thể tự mình sử dụng sp_helptext để "đảo ngược kỹ sư" các khung nhìn INFORMATION_SCHEMA, nhưng truy vấn của bạn bị cùng một vấn đề với tôi - nó sẽ thất bại nếu xem được tạo từ một JOIN. Ví dụ, nó ánh xạ cả hai trường 'lastName' và 'code' vào bí danh 'surName' trong ví dụ của tôi. Tôi sẽ cập nhật câu hỏi để phản ánh điều này. –

5

Tôi nghĩ bạn không thể.

Chọn truy vấn ẩn nguồn dữ liệu thực mà nó đã được thực hiện. Bởi vì bạn có thể truy vấn bất cứ điều gì, tức là xem, bảng, thậm chí cả máy chủ từ xa được liên kết.

+0

@ Segphault: Tại sao bạn downvote câu trả lời của tôi mà không có một bình luận? Bạn không đồng ý Đuợc. Nhưng đó không phải là một lý do cho downvote, imo. – abatishchev

+0

Làm cho tinh thần. Một cách sử dụng Chế độ xem là ẩn các chi tiết khỏi con mắt tò mò. Phải vạch trần loại cho nó được tiêu thụ. +1 – Paparazzi

2

Không phải là một giải pháp hoàn hảo; nhưng, có thể phân tích cú pháp view_definition với độ chính xác cao, đặc biệt nếu mã được tổ chức tốt với bí danh nhất quán bằng 'as'. Ngoài ra, người ta có thể phân tích cú pháp dấu phẩy ',' sau bí danh.

Đáng chú ý: lĩnh vực cuối cùng trong mệnh đề select sẽ không có dấu phẩy và tôi đã không thể loại trừ các mặt hàng đang được sử dụng như bình luận (ví dụ xen kẽ trong văn bản xem với -)

tôi viết dưới đây cho một bảng có tên là 'My_Table' và chế độ xem tương ứng được gọi là 'vMy_Table'

select alias, t.COLUMN_name 
from 
(
select VC.COLUMN_NAME, 



case when 
ROW_NUMBER() OVER (
partition by C.COLUMN_NAME order by 
CHARINDEX(',',VIEW_DEFINITION,CHARINDEX(C.COLUMN_NAME,VIEW_DEFINITION))- 
CHARINDEX(VC.COLUMN_NAME,VIEW_DEFINITION) 

) = 1 

then 1 
else 0 end 
as lenDiff 



,C.COLUMN_NAME as alias 

,CHARINDEX(',',VIEW_DEFINITION,CHARINDEX(C.COLUMN_NAME,VIEW_DEFINITION)) diff1 
, CHARINDEX(VC.COLUMN_NAME,VIEW_DEFINITION) diff2 

from INFORMATION_SCHEMA.VIEW_COLUMN_USAGE VC 
inner join INFORMATION_SCHEMA.VIEWS V on V.TABLE_NAME = 'v'+VC.TABLE_Name 
inner join information_schema.COLUMNS C on C.TABLE_NAME = 'v'+VC.TABLE_Name 
where VC.TABLE_NAME = 'My_Table' 
and CHARINDEX(',',VIEW_DEFINITION,CHARINDEX(C.COLUMN_NAME,VIEW_DEFINITION))- 
CHARINDEX(VC.COLUMN_NAME,VIEW_DEFINITION) >0 
) 
t 

where lenDiff = 1 

Hope this helps và tôi mong muốn được phản hồi của bạn

Các vấn đề liên quan