SQL Server: вместо запуска обновления при просмотре; выберите все столбцы, кроме определенного, и обновите запись базовой таблицы

У меня есть представление, в котором есть realField1, RealField2, Realfield3 и многие другие реальные поля, а также вычисляемый столбец с именем isHighestVersion.

(realField означает реальный столбец в таблице SQL Server, имена столбцов переименованы для краткости).

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

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

Поскольку у меня будет много таких представлений, а поля базовых таблиц и представлений могут измениться во время разработки, я хочу иметь «общий» код SQL в триггерах, который извлекает все столбцы (кроме столбца isHighestVersion) из "вставленная" таблица, а затем обновляет правильную запись в одной реальной базовой таблице - конечно, без несуществующего столбца ishighestversion.

Как это сделать?


person John Ranger    schedule 09.10.2018    source источник
comment
«общий код SQL» — да, не так много в SQL Server. Вы либо пишете определенный код, либо пытаетесь написать динамический SQL, который создает определенный код во время выполнения. Но это не будет красиво и, вероятно, будет иметь свои собственные ограничения, подобные тем, которые накладывает SQL Server (если бы это было тривиально, я уверен, что для представлений была бы какая-то опция ALLOW_DML_IGNORE_COMPUTED_COLUMNS).   -  person Damien_The_Unbeliever    schedule 10.10.2018


Ответы (1)


Это просто... ты не можешь. Здесь нет работы. Это нарушает ограничения обновляемого представления. Это четко указано в документация.

Вычисление. Столбец нельзя вычислить из выражения, использующего другие столбцы.

person Sean Lange    schedule 09.10.2018
comment
Привет, Шон, я думаю, ты не понял моего вопроса. К вашему сведению: вместо триггеров обновления можно создать собственный оператор обновления, который влияет только на одну базовую таблицу. На самом деле мой вопрос заключался в том, как спроектировать этот настраиваемый запрос на обновление, чтобы он принимал все поля, кроме одного, из вставленной таблицы (это специальная таблица при использовании вместо триггеров обновления), а затем обновлял базовую таблицу значениями из вставленная таблица. - person John Ranger; 10.10.2018
comment
Да, я думаю, вы правы, я не понял, о чем вы спрашивали. К вашему сведению, вставленная таблица доступна во ВСЕХ триггерах, а не только вместо триггеров. Вам понадобится динамический sql, чтобы сделать это динамически. - person Sean Lange; 10.10.2018