2009-04-02 1 views
2

Я хочу запрос, который будет возвращать строку для каждого столбца в представлении, а также строку для само представление.Запрос SQL Server (2005+) для возврата базовой таблицы и базового столбца (поля) для каждого столбца (поля) в представлении

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

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

В приведенном ниже примере «что здесь происходит» следует заменить таблицей 1 или таблицей 2 в соответствующем столбце базы данных и 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 

ответ

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 

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

Однако он работает только при использовании столбцов непосредственно из базовых таблеток без какой-либо формулы ar.

1

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

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

+0

Да, это бонус: если он может вернуться ко мне с расчетами для вычисленных полей. Просто интересно, есть ли способ, основанный на разборе SQL Server, который уже выполняет - тот факт, что он может запускать запрос, означает, что это возможно. –

+0

Но каков может быть способ получить это с учетом взглядов - это прямой запрос с объединениями между несколькими вкладками? – Kangkan