2

ビューを作成する必要がありますが、データは、列数に基づいて1つの内部テーブル定義に対して7つを超えるSQLServerテーブルを作成できるテーブル用の独自のデータベース管理を備えたアプリケーションから生成されます。

テーブルはすべて['m'&number]で終わります。たとえばdevicem1devicem2..。devicem10

それらはすべてlogical_name主キーとして含まれていますが、どのテーブルが内部テーブルの他の列を保持するかを信頼することはできません。

deviceアプリケーションが変更されたときに、作成したいストアドプロシージャを台無しにしないように、テーブルを結合するビューを作成する必要があります。

このクエリに基づく:

CREATE VIEW device AS
   SELECT *
   FROM devicem1 m1, devicem2 m2, devicem3 m3, ... devicem10 m10
   WHERE m1.logical_name = m2.logical_name
   AND m1.logical_name = m3.logical_name
   ...
   AND m1.logical_name = m10.logical_name

&が存在しない可能性があるという事実を無視できる10個のテーブルを結合する方法はありますか?devicem9devicem10

4

2 に答える 2

2

ビューの要件に関して。参照されるテーブルは、ビューの作成時に存在している必要があります。SQLエンジンでは、存在しないテーブルを参照するビューを作成することはできません。

ビューは単なる保存されたselectステートメントであると考えると、ビューが作成された後、テーブルを削除できます(スキーマバインディングが機能していない場合)。ただし、ビューを呼び出したり使用したりするときは常に、参照されているすべてのテーブルが存在している必要があります。存在していないと、エラーが発生します。

また、ビューで特に使用されているフィールドが削除されない限り、参照されるテーブルのスキーマを変更できますが、ビューで使用されている特定の列が欠落している場合、ビューを使用したクエリは失敗します。

いくつかの創造的なテーブル値関数と動的SQLで何をしようとしているのかをうまくやっていくことができるかもしれません。テーブル値関数は、基本的に、パラメーターと拡張ロジックを許可する単なるビューです。

全体として、あなたの説明は少し大雑把に聞こえますが。

于 2012-05-09T02:38:08.063 に答える
2

利用可能なテーブルに基づいて、定期的にビューを再作成します。

したがって、アプリケーションを毎晩実行してテーブルを作成する場合は、アプリの実行後に、使用可能なテーブルを確認してビューを再作成します。

最後に、動的SQLを使用して、次のようなことを行う必要があります。

declare @sql varchar(max);

select @sql = (select '(select * from '+table_name+') union all'
               from information_schema.tables
               for xml path (''));
set @sql = left(@sql, len(@sql) - 10);

set @sql = 'create view <whatever> as '+@sql;
exec(@sql);
于 2012-05-09T02:52:34.800 に答える