假设我有一个视图,其中一些列名是别名,例如本例中的“surName”:
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'
产量:
---------------- |别名 |类型 | ---------------- |名字 |nchar| |中间名|nchar| |姓氏 |nchar| ----------------
但是,我也想知道实际的列名。理想情况下:
-------------------------- |别名 |类型 |真实姓名 | -------------------------- |名字 |nchar|名字 | |中间名|nchar|中间名| |姓氏|nchar|姓氏| --------------------------
如何根据别名确定真正的列名是什么? 必须有某种方法可以使用 sys 表和/或 INFORMATION_SCHEMA 视图来检索此信息。
编辑: 我可以接近这种可憎的东西,这类似于 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'
这产生:
-------------------------- |别名 |类型 |真实姓名 | -------------------------- |名字 |nchar|名字 | |中间名|nchar|中间名| |surName |nchar|代码 | |姓氏|nchar|姓氏| --------------------------
但是第三条记录是错误的——任何使用“JOIN”子句创建的视图都会发生这种情况,因为有两列具有相同的“column_id”,但在不同的表中。