我正在尝试以view
与选择 from 类似的方式选择a 的列名information_schema.columns
。
我似乎找不到办法做到这一点。以前有没有其他人这样做过,或者知道这是否可能?
information_schema.columns.Table_name(至少在 Sql Server 2000 下)包括视图,所以只需使用
SELECT * FROM information_schema.columns WHERE table_name = 'VIEW_NAME'
试试这个:
SELECT *
FROM sys.views
这为您提供了这样的视图 - 如果您需要列,请使用:
SELECT *
FROM sys.columns
WHERE object_id = OBJECT_ID('dbo.YourViewNameHere')
不确定如何使用- 我从不使用它,因为与模式目录视图INFORMATION_SCHEMA
相比,它感觉相当“笨拙”且不直观。sys
有关所有可用视图的所有详细信息,以及它们可能包含的信息,请参阅目录视图上的 MSDN 文档。
我发现这种方式适用于视图(SQL 2017)。我无法从information_schema.columns
and获取数据sys.columns
:
SELECT * FROM sys.all_columns WHERE object_id = OBJECT_ID('<view_name>')
INFORMATION_SCHEMA 视图保存有关数据库中对象的元数据。INFORMATION_SCHEMA.COLUMNS 使用底层 sys 表来检索元数据(检查 sp_helptext 'master.Information_schema.columns' )。您可以使用这个更简单的查询来选择在任何视图中使用的列名。
SELECT col.name
FROM <db_name>.sys.columns col, <db_name>.sys.views vew
WHERE col.object_id = vew.object_id
AND vew.name = '<view_name>'
SELECT distinct VIEW_NAME
,TABLE_SCHEMA
,TABLE_NAME
,COLUMN_NAME
FROM INFORMATION_SCHEMA.VIEW_COLUMN_USAGE
--WHERE TABLE_SCHEMA = 'Person'
ORDER BY
VIEW_NAME
,TABLE_SCHEMA
,TABLE_NAME
,COLUMN_NAME
select schema_name(v.schema_id) as schema_name,
object_name(c.object_id) as view_name,
c.column_id,
c.name as column_name,
type_name(user_type_id) as data_type,
c.max_length,
c.precision
from sys.columns c
join sys.views v
on v.object_id = c.object_id
order by schema_name,
view_name,
column_id;
我需要创建类似的东西,所以我阐述了 Ghost 的建议。我需要按第一个序列降序为数据库顺序中的每个视图创建前 1000 个视图。
SELECT CONCAT (
'CREATE VIEW dbo.temp_',
v.name,
' AS select top (1000) * from ',
OBJECT_SCHEMA_NAME (v.object_id),
'.',
v.name,
' ORDER BY [',
c.COLUMN_NAME,
'] DESC;'
) AS viewName
FROM sys.views AS v
LEFT OUTER JOIN INFORMATION_SCHEMA.COLUMNS AS c
ON v.name = c.TABLE_NAME
WHERE c.ORDINAL_POSITION = 1;