2012-04-06 19 views
11

Załóżmy, że mam widok, w którym niektóre nazwy kolumn są pseudonimy, jak „nazwisko” w poniższym przykładzie:Znajdź prawdziwą nazwę kolumny aliasu używanego w widoku?

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

jestem w stanie odzyskać informacje o widoku za pomocą poglądy INFORMATION_SCHEMA.
Na przykład, zapytanie

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

plony:

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

Jednak chciałbym poznać rzeczywistą nazwę kolumny, jak również. Idealnie:

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

Jak mogę określić, jaka jest rzeczywista nazwa kolumny jest oparty na alias? Musi być jakiś sposób korzystania z tabel Sys i widoków INFORMATION_SCHEMA w celu pobrania tych informacji.


EDIT: mogę zbliżyć się z tego paskudztwa, który jest podobny do Ariona odpowiedź:

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' 

Daje:

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

ale trzeci rekord jest źle - dzieje się tak z każdym widokiem utworzonym za pomocą klauzuli "JOIN", ponieważ istnieją dwie kolumny z tym samym "column_id", ale w innej tabeli s.

+0

AFAIK, regularne składni dla kolumny pseudonimu używa 'AS': wybierz Columna jako columnB z t – abatishchev

+2

Prawdziwe imię ponieważ widok nie może nawet być kolumną, więc nie ma sposobu, aby to zrobić. Jaka byłaby nazwa kolumny w tym widoku? Utwórz widok jako wybierz 1 b –

+0

Dopóki opcja ['VIEW_METADATA'] (http://msdn.microsoft.com/en-us/library/ms187956.aspx) nie jest ustawiona podczas tworzenia widoku SQL Server zwróci do DB-Library, ODBC i OLE DB API -s metadane trybu przeglądania zawierające informacje o tabeli podstawowej, do której należą kolumny w zestawie wyników. Nigdy jednak nie patrzyłem na ten aspekt. –

Odpowiedz

12

Biorąc pod uwagę ten pogląd:

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

Co widzę można uzyskać kolumny używane i tabele używane w ten sposób:

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' 

To jest dla SQL Server 2005+. Zobacz odwoływać here

Edit

dać taki sam pogląd. Spróbuj tego zapytania:

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'; 

zwraca to dla mnie:

columnName dataType alias 

id   int  id 
author  varchar author 
title  varchar Name 

to również testowane w sql 2005+

+0

Jest to interesujące, ale nic nie widzę w widoku INFORMATION_SCHEMA.VIEW_COLUMN_USAGE, którego można użyć w łączeniu w celu odwzorowania na nazwę aliasu. W moim przykładzie kolumny są zwracane w innej kolejności. Dla INFORMATION_SCHEMA.COLUMNS istnieje "ORDINAL POSITION". Brak szczęścia dla INFORMATION_SCHEMA.VIEW_COLUMN_USAGE. –

+0

Zaktualizowałem odpowiedź .. Mam wygląd: P – Arion

+0

Dzięki, w zasadzie to mogę zrobić ze sobą używając sp_helptext, aby "odwrócić inżynier" widoków INFORMATION_SCHEMA, ale twoje zapytanie cierpi na ten sam problem co mój - nie powiedzie się, jeśli widok jest tworzony z JOIN. Na przykład mapuje oba pola "lastName" i "code" do aliasu "surName" w moim przykładzie. Zaktualizuję pytanie, aby to odzwierciedlić. –

5

Myślę, że nie możesz.

Wybierz zapytanie ukrywa faktyczne źródło danych, z którym zostało wykonane. Ponieważ możesz wyszukiwać dowolne informacje, np. Widok, tabelę, nawet powiązany serwer zdalny.

+0

@Segphault: Dlaczego uzasadniasz moją odpowiedź bez komentarza? Nie zgadzasz się? W porządku. Ale to nie jest powód do przegranej, imo. – abatishchev

+0

Ma sens. Jednym z zastosowań Widoku jest ukrywanie szczegółów przed wzrokiem ciekawskich. Musisz wystawić typ na pochłanianie. +1 – Paparazzi

2

Nie jest to idealne rozwiązanie; ale możliwe jest parsowanie definicji view_definition z dużym stopniem dokładności, szczególnie jeśli kod jest dobrze zorganizowany ze spójnym aliasingiem według "as". Dodatkowo można parsować po przecinku "," po aliasie.

Of Uwaga: końcowe pola w klauzuli SELECT nie będzie miała przecinek i nie byłem w stanie wykluczyć elementy wykorzystywane jako komentarzach (na przykład w tekście przeplotem widoku z -)

napisałem poniżej dla tabeli o nazwie „My_Table” i widok odpowiednio o nazwie „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 

Nadzieja to pomaga i czekam na Wasze opinie

Powiązane problemy