【问题标题】:SQL Server (2005+) query to return the base table and base column (field) for each column (field) in a viewSQL Server (2005+) 查询返回视图中每个列(字段)的基表和基列(字段)
【发布时间】:2010-10-17 04:49:37
【问题描述】:

我想要一个查询,它将为视图中的每一列返回一行,并为视图本身返回一行。

结果中应该有一个列基表,它为当前行中的列提供基表,结果中应该有一个列基字段,它给出基础查询中列的名称(对于重命名的列)。如果任何计算也可以包含在 basefield 列中,那将是一个额外的好处。

我不认为这是可以做到的。我错了吗?

在下面的示例中,“这里发生了什么”应在 basetable 列中适当替换为 table1 或 table2,在 basefield 列中适当替换为 a、b 或 c。

创建表 table1 (a int, b int) 创建表 table2 (a int, c int) 走 创建视图view1 as select table1.a, table1.b, table2.c from table1 left join table2 on table1.a = table2.a 走 选择 * 从 ( select 'View' objecttype,O.name viewname,'' fieldname,0 column_id,'' typename,'' max_length,'' [precision], '' scale, '' is_identity, '这里发生了什么' basetable,'' basefield 从 sys.objects O where O.type='V' and O.[schema_id] = 1 联合所有 select 'Field' objecttype,object_name(C.[object_id]) viewname,C.name fieldname,C.column_id,T.name typename,C.max_length,C.precision,C.scale,C.is_identity, '这里有什么' basetable,'这里有什么' basefield 来自 sys.columns C left join sys.types T on C.user_type_id=T.system_type_id 其中 C.[object_id] in (select O.[object_id] from sys.objects O where O.type='V') ) 一世 其中视图名称在('view1') 按视图名、column_id 排序 下降视图 view1 删除表 table1 删除表 table2

【问题讨论】:

    标签: sql-server sql-server-2005 database-design schema


    【解决方案1】:

    信息架构中有几个表可用于推断信息。为您提供大量数据的基本查询将是:

    select * 
    from INFORMATION_SCHEMA.VIEW_COLUMN_USAGE v
        inner join INFORMATION_SCHEMA.COLUMNS v1
            on  v.VIEW_NAME=v1.TABLE_NAME and v.COLUMN_NAME=v1.COLUMN_NAME
    where v.VIEW_NAME='My_View'
    

    信息架构中的表是:

    select * from INFORMATION_SCHEMA.VIEWS
    select * from INFORMATION_SCHEMA.VIEW_TABLE_USAGE
    select * from INFORMATION_SCHEMA.VIEW_COLUMN_USAGE
    

    所以尝试使用这些。

    但是,它仅在您直接使用基本表格中的列而不派生任何公式时才有效。

    【讨论】:

      【解决方案2】:

      您知道它可能不会将 1 映射到 1 吗?视图中的列可能是来自不同表的多个(甚至没有!)列的结果。

      也就是说,通过解析视图的源代码应该是可能的。但是 sql 代码本质上是程序性/命令性的,而且一点也不简单。

      【讨论】:

      • 是的,这就是奖励:如果它可以通过计算字段的计算返回给我。只是想知道是否有一种基于 SQL Server 已经解析的方法 - 它可以运行查询这一事实意味着这是可能的。
      • 但是,考虑到视图是在多个表之间连接的直接查询,有什么方法可以得到它?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-13
      相关资源
      最近更新 更多