Как определить, является ли столбец представления производным или постоянным?

Допустим, у меня есть следующая таблица:

create table t_Item (
    ItemID int not null identity(1,1) constraint PK_Item primary key,
    Description varchar(256) not null,
    Price decimal(10,2) not null
)

и следующий вид:

create view Item as
  select ItemID
        ,Description
        ,Price
        ,1.09 Tax
        ,Price * 1.09 TaxedPrice
    from t_Item

TaxedPrice является производным столбцом, и Tax постоянный столбец.

Поэтому я не могу вставить или обновить ни один из них. Первый следующий запрос будет пройден, тогда как остальные будут с ошибкой.

insert into Item (Description, Price) values ('Test item', 14.00)

insert into Item (Description, Price, TaxedPrice) values ('Test item', 14.00, 15.26)

insert into Item (Description, Price, Tax) values ('Test item', 14.00, 1.09)

И вот возвращаемое сообщение об ошибке:

Не удалось обновить или вставить представление или функцию "Элемент", поскольку оно содержит производное или постоянное поле.

Есть ли способ, может быть с системными представлениями, перечислить столбцы представления, которые не должны обновляться?

2 ответа

Решение

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

  1. Любые столбцы происходят из следующих функций агрегирования, которые рассматриваются как производные столбцы. AVG, COUNT,SUM,MIN,MAX,GROUPING,STDEV,STDEVP,VAR,VARP
  2. Если определение представления содержит следующий синтаксис, все столбцы считаются производными столбцами. СОЮЗ, СОЮЗ ВСЕ, КРОССЖОЙН, КРОМЕ, ИНТЕРСЕКТ
  3. Столбцы, на которые влияют GROUP BY, HAVING, DISTINCT, также считаются производными столбцами.

Я не думаю, что это охватывает все сценарии, но является отправной точкой для написания парсера.

Другие вопросы по тегам