查找在视图中使用别名的实际列名?查找在视图中使用别名的实际列名?(Find the real col

2019-05-13 11:02发布

假设我有一个观点,其中一些列名是别名,就像在这个例子中“姓”:

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

我能够检索有关使用INFORMATION_SCHEMA视图的视图的一些信息。
例如,查询

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

收益率:

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

不过,我想知道实际的列名也。 理想的情况是:

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

我怎样才能确定真正的列名是基于别名是什么? 必须有某种方式来使用sys表和/或INFORMATION_SCHEMA视图来检索这些信息。


编辑:我能接近这个令人深恶痛绝,这类似于联发的回答是:

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'

这产生了:

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

但第三个记录是错误的 - 这种情况与使用“加入”的条款产生任何看法,因为有两列相同的“COLUMN_ID”,但在不同的表。

Answer 1:

鉴于这样的观点:

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

我可以看到你可以使用的列,并通过这样做,所使用的表:

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'

这是SQL Server 2005+。 请参见参考这里

编辑

给出了同样的观点。 试试这个查询:

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

它返回这对我来说:

columnName  dataType  alias

id          int       id
author      varchar   author
title       varchar   Name

这也在SQL测试2005+



Answer 2:

我认为你不能。

选择查询隐藏它是针对进行实际的数据源。 因为你可以查询任何东西,即视图,表,甚至连接的远程服务器。



Answer 3:

不是一个完美的解决方案; 但是,它是能够以高精确度来分析view_definition特别是如果代码是很好用“为”一致走样组织。 此外,一个可以解析为别名后一个逗号“”。

值得注意的是:SELECT子句中的最后一个字段不会有逗号,我无法排除项目被用作注释(例如与视图的文字隔行 - )

我写了下面的一个名为“MY_TABLE”,并查看相应的表称为“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 

希望这可以帮助,我期待着您的反馈



Answer 4:

已经花了几个小时试图找到一个答案,并多次运行到没有工作和海报,上面似乎最终放弃的解决方案,我终于越过这里的答案,似乎工作跌跌撞撞:

https://social.msdn.microsoft.com/Forums/windowsserver/en-US/afa2ed2b-62de-4a5e-ae70-942e75f887a1/find-out-original-columns-name-when-used-in-a-view-用别名?论坛= TRANSACTSQL

下面的SQL回报,我相信,你正在寻找,它肯定是在做什么,我需要的东西,似乎进行的很顺利。

SELECT  name
    , source_database
    , source_schema
    , source_table
    , source_column
    , system_type_name
    , is_identity_column
FROM    sys.dm_exec_describe_first_result_set (N'SELECT * from ViewName', null, 1) 

在文档sys.dm_exec_describe_first_result_set功能可以在这里找到,这是在SQL Server 2012及更高版本:

https://docs.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-exec-describe-first-result-set-transact-sql

完全学分制的链路上的海报,我没有工作,这一点我自己,但我想如果在这里发表这个,因为我发现这是其他任何人搜索此信息有用这个线程比更容易地多,我联系到一个。



文章来源: Find the real column name of an alias used in a view?