Почему SQL Server не может изменить вид в сохраненной процедуре?
-
02-10-2019 - |
Вопрос
Я использую MS SQL Server, и я хотел бы изменить вид из в хранимой процедуре, выполнив что-то вроде «ALTER Viewname ImeSname как ([некоторые SQL])».
Несколько страниц, выброшенные Google Assert, что это не поддерживается напрямую (и ни один из них не связаны с изменением альтернонты), но есть также примеры того, как работать вокруг него, используя такие конструкции:
declare @sql varchar(max)
select @sql = 'alter view VIEWNAME as ([some sql])'
exec(@sql)
Написание кода как буквальные строки пахнут немного, даже для SQL.
Мои вопросы:
- Почему это не поддерживается? Какая разница между запуском этого из шПоката и запущена его в качестве автономной оператора?
- Почему обходной путь через
exec
Литеративная работа SQL String? Мое пониманиеexec
Заявление заключается в том, что он просто выполняет строку SQL, это неверно? - (Не оптимистично) Есть ли лучший способ внести изменения на вид в хранимой процедуре?
Решение
Я думаю, что ответы:
- MS хочу предотвратить работу DDL из процедур.
- Код в пределах Заявление Exec не рассматривается как часть процедуры - поэтому он не подвержен той же ограничениям, что и процедура.
- Нет.
Альтернативный подход может быть отдельную таблицу (называемое что-то вроде swing_table) с 1 или 0 записями для указания того, должен ли представление запрашивать производство или другую (резервную копию?) Таблицу соответственно - что-то вроде:
create view viewname as
select {field list}
from production_table
cross join swing_table
union all
select {field list}
from backup_table
where (select count(*) from swing_table) = 0
- Тогда усейте swing_table в процедуре, когда вы хотите, eRM, качайте таблицу - поскольку усеченность не является командой транзакции, она должна выполняться немедленно.