SQL Serverがストアドプロシージャでビューを変更できないのはなぜですか?
-
02-10-2019 - |
質問
私はMS SQL Serverを使用しています。「[SQL])を変更する」などの何かを実行して、ストアドプロシージャ内からビューを変更したいと思います。
Googleが投げかけた数ページは、これが直接サポートされていないことを主張しています(また、関連する分身のステートメントではありません)が、次のような構造を使用して回避する方法の例もあります。
declare @sql varchar(max)
select @sql = 'alter view VIEWNAME as ([some sql])'
exec(@sql)
文字通りの文字列としてコードを書くことは、SQLであっても少し匂いがします。
私の質問:
- なぜこれがサポートされていないのですか?これをSPROCから実行して、スタンドアロンの声明として実行することの違いは何ですか?
- なぜ回避策は通り抜けますか
exec
文字通りのSQL文字列の動作をしていますか?の私の理解exec
ステートメントは、SQLをインラインで実行するだけで、それは間違っていますか? - (楽観的ではありません)ストアドプロシージャ内からのビューに変更を加えるためのより良い方法はありますか?
解決
答えは次のとおりです。
- MSは、DDLが手順内から実行されるのを防ぎたいと考えています。
- コード 以内に Exec Statementは、手順の一部として扱われないため、手順と同じ制限の対象ではありません。
- いいえ。
別のアプローチは、1つまたは0のレコードを備えた別のテーブル(Swing_tableのようなものと呼ばれる)を使用して、ビューがそれぞれ制作(バックアップ?)テーブルを照会する必要があるかどうかを示すことです - 次のようなものです。
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を切り捨て、テーブルをスイングします - トランケートはトランザクションコマンドではないため、すぐに実行する必要があります。
所属していません StackOverflow