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

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

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

Я не думаю, что это можно сделать. Я не прав?

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

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

Ответы [ 2 ]

1 голос
/ 11 июля 2011

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

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

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

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

1 голос
/ 02 апреля 2009

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

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

...