Я думаю, что ответы таковы:
- 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
- затем TRUNCATE swing_table внутри процедуры, когда вы хотите,ну, качайте таблицу - поскольку TRUNCATE не является транзакционной командой, она должна выполняться немедленно.