質問

私はMS SQL Serverを使用しています。「[SQL])を変更する」などの何かを実行して、ストアドプロシージャ内からビューを変更したいと思います。

Googleが投げかけた数ページは、これが直接サポートされていないことを主張しています(また、関連する分身のステートメントではありません)が、次のような構造を使用して回避する方法の例もあります。

declare @sql varchar(max)
select @sql = 'alter view VIEWNAME as ([some sql])'
exec(@sql)

文字通りの文字列としてコードを書くことは、SQLであっても少し匂いがします。

私の質問:

  1. なぜこれがサポートされていないのですか?これをSPROCから実行して、スタンドアロンの声明として実行することの違いは何ですか?
  2. なぜ回避策は通り抜けますか exec文字通りのSQL文字列の動作をしていますか?の私の理解 exec ステートメントは、SQLをインラインで実行するだけで、それは間違っていますか?
  3. (楽観的ではありません)ストアドプロシージャ内からのビューに変更を加えるためのより良い方法はありますか?
役に立ちましたか?

解決

答えは次のとおりです。

  1. MSは、DDLが手順内から実行されるのを防ぎたいと考えています。
  2. コード 以内に Exec Statementは、手順の一部として扱われないため、手順と同じ制限の対象ではありません。
  3. いいえ。

別のアプローチは、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を切り捨て、テーブルをスイングします - トランケートはトランザクションコマンドではないため、すぐに実行する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top