2012-04-06 9 views
11

Supongamos que tengo una vista en la que algunos de los nombres de columna son los alias, como "Apellido" en este ejemplo:¿Encontrar el nombre de columna real de un alias utilizado en una vista?

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

soy capaz de recuperar algo de información acerca de la vista mediante las vistas INFORMATION_SCHEMA.
Por ejemplo, la consulta

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

rendimientos:

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

Sin embargo, me gustaría saber el nombre real de la columna también. Lo ideal sería:

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

¿Cómo puedo determinar cuál es el nombre de la columna verdadera se basa en el alias? Debe haber alguna forma de utilizar las tablas sys y/o las vistas INFORMATION_SCHEMA para recuperar esta información.


EDIT: yo puede conseguir cercano con esta abominación, que es similar a la respuesta de Arion:

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' 

Esto produce:

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

pero el tercer registro es incorrecto - esto sucede con cualquier vista creada con una cláusula "JOIN", porque hay dos columnas con el mismo "column_id", pero en una tabla diferente s.

+0

que yo sepa, la sintaxis regular para alias de columna está usando 'AS': seleccione columna como columnB desde t – abatishchev

+2

El nombre real para una vista puede que ni siquiera sea una columna, por lo que no hay forma de hacerlo. ¿Cuál sería el nombre de la columna en esta vista? Crear vista a como seleccionar 1 b –

+0

Siempre y cuando la opción ['VIEW_METADATA'] (http://msdn.microsoft.com/en-us/library/ms187956.aspx) no esté configurada al crear la vista SQL Server devolverá a las API DB-Library, ODBC y OLE DB. Metadatos de modo de exploración que incluyen información sobre la tabla base a la que pertenecen las columnas en el conjunto de resultados. Aunque nunca miré este aspecto yo mismo. –

Respuesta

12

Teniendo en cuenta este punto de vista:

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

Lo que puedo ver que usted puede conseguir las columnas utilizadas y las tablas utilizadas por hacer esto:

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' 

Esto es para SQL Server 2005 +. Véase la referencia here

Editar

Dale la misma vista. Intentar esta consulta:

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

Devuelve esto por mí:

columnName dataType alias 

id   int  id 
author  varchar author 
title  varchar Name 

Esto también se prueba en SQL 2005 +

+0

Esto es interesante, pero no hay nada que pueda ver en la vista INFORMATION_SCHEMA.VIEW_COLUMN_USAGE que podría usarse en una combinación para asignar el nombre de alias. En mi ejemplo, las columnas se devuelven en un orden diferente. Para INFORMATION_SCHEMA.COLUMNS, hay una "POSICIÓN ORDINAL". No hay tal suerte para INFORMATION_SCHEMA.VIEW_COLUMN_USAGE. –

+0

Actualicé la respuesta. Mire: P – Arion

+0

Gracias, esto es esencialmente lo que puedo hacer conmigo mismo al usar sp_helptext para "aplicar ingeniería inversa" a las vistas INFORMATION_SCHEMA, pero su consulta sufre el mismo problema que la mía - fallará si el view se crea a partir de un JOIN. Por ejemplo, asigna los campos 'lastName' y 'code' al alias 'surName' en mi ejemplo. Actualizaré la pregunta para reflejar esto. –

5

Creo que no se puede.

Seleccionar consulta oculta el origen de datos real que se realizó en contra. Porque puede consultar cualquier cosa, es decir, ver, tabla, incluso servidor remoto vinculado.

+0

@Segphault: ¿Por qué rechaza mi respuesta sin un comentario? ¿No estás de acuerdo? Bueno. Pero esa no es una razón para downvote, imo. – abatishchev

+0

Tiene sentido. Un uso de una Vista es ocultar los detalles de miradas indiscretas. Tiene que exponer el tipo para que se consuma. +1 – Paparazzi

2

No es una solución perfecta; pero, es posible analizar la definición de vista con un alto grado de precisión, especialmente si el código está bien organizado con aliasing consistente por 'como'. Además, uno puede analizar una coma ',' después del alias.

Es de destacar: el campo final en la cláusula select no tiene la coma y no pude excluir los artículos que son utilizados como comentarios (por ejemplo, entrelazado en el texto ver con -)

me escribió el siguiente para una tabla llamada 'my_table' y ver su correspondiente llamada '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 

espero que esto ayude y espero con interés sus comentarios

Cuestiones relacionadas