6

MS SQL Server を使用しています。「alter view VIEWNAME as ([some sql])」などを実行して、ストアド プロシージャ内からビューを変更したいと考えています。

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

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

コードをリテラル文字列として記述するのは、SQL であっても少し臭いです。

私の質問:

  1. これがサポートされていないのはなぜですか? これを sproc から実行することと、スタンドアロンのステートメントとして実行することの違いは何ですか?
  2. execリテラル SQL 文字列を ing することによる回避策が機能するのはなぜですか? ステートメントについての私の理解ではexec、SQL をインラインで実行するだけですが、それは正しくありませんか?
  3. (楽観的ではありません) ストアド プロシージャ内からビューを変更するより良い方法はありますか?
4

1 に答える 1

2

答えは次のとおりだと思います。

  1. MS は、プロシージャ内から DDL が実行されるのを防ぎたいと考えています。
  2. exec ステートメント内のコードは、プロシージャの一部として扱われないため、プロシージャと同じ制限を受けません。
  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

- 次に、テーブルをスイングしたい場合は、プロシージャ内で TRUNCATE swing_table を実行します - TRUNCATE はトランザクション コマンドではないため、すぐに実行する必要があります。

于 2010-09-16T16:45:08.177 に答える