假设我有一个观点,其中一些列名是别名,就像在这个例子中“姓”:
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?