Запрос SQL Server (2005+) для возврата базовой таблицы и базового столбца (поля) для каждого столбца (поля) в представлении

Мне нужен запрос, который вернет строку для каждого столбца в представлении и строку для самого представления.

В результате должна быть базовая таблица столбца, которая дает базовую таблицу для столбца в текущей строке, и базовое поле столбца в результате, которое дает имя столбца в базовом запросе (для переименованных столбцов). Было бы неплохо, если бы любые расчеты также могли быть включены в столбец базового поля.

Я не думаю, что это можно сделать. Я ошибся?

В приведенном ниже примере «то, что идет здесь», следует заменить на table1 или table2, в зависимости от ситуации, в столбце базовой таблицы и на a, b или c, в зависимости от ситуации, в столбце базового поля.

create table table1 (a int, b int)
create table table2 (a int, c int)
go
create view view1 as select table1.a, table1.b, table2.c from table1 left join table2 on table1.a = table2.a
go

select * from 
(
 select 'View' objecttype,O.name viewname,'' fieldname,0 column_id,'' typename,'' max_length,'' [precision], '' scale, '' is_identity,
    'what goes here' basetable, '' basefield
 from sys.objects O where O.type='V' and O.[schema_id] = 1

 union all

  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,
  'what goes here' basetable, 'what goes here' basefield
  from sys.columns C
 left join sys.types T on C.user_type_id=T.system_type_id
 where C.[object_id] in (select O.[object_id] from sys.objects O where O.type='V')
) I
where viewname in ('view1')
order by viewname, column_id

drop view view1
drop table table1
drop table table2

person Simon D    schedule 02.04.2009    source источник


Ответы (2)


В информационной схеме есть несколько таблиц, которые можно использовать для вывода информации. Базовый запрос, который дает вам довольно много данных, будет:

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

Так что попробуйте использовать это.

Однако это работает только тогда, когда вы используете столбцы непосредственно из базовых таблиц без получения каких-либо формул.

person Kangkan    schedule 11.07.2011

Вы знаете, что он может не отображать 1 в 1? Столбец в представлении может быть результатом нескольких (или даже ни одного!) Столбцов из разных таблиц.

Тем не менее, это должно быть возможно при синтаксическом анализе источника для представления. Но код sql будет процедурным / императивным по своей природе и вовсе не тривиальным.

person Joel Coehoorn    schedule 02.04.2009
comment
Ага, вот и бонус: если бы он мог вернуться ко мне с расчетом для вычисляемых полей. Просто интересно, есть ли способ, основанный на синтаксическом анализе, который уже выполняет SQL Server - тот факт, что он может выполнять запрос, означает, что это возможно. - person Simon D; 02.04.2009
comment
Но как это сделать, учитывая, что представления представляют собой прямой запрос с объединениями между несколькими таблицами? - person Kangkan; 08.07.2011