2011-07-19 21 views
2

私は数多くの研究を行い、これを行う方法を見つけようとしましたが、示唆されていることはすべて私にとってはうまくいかないようです。私はこれを行うと、私はtable1_nameに変更を加えた場合、これらの変更は、(私が好きな)ビューに反映されているSQL Serverビューにテーブルを挿入する

CREATE VIEW view_name AS SELECT * FROM table1_name 

:私は、次のSQLを使用してテーブルを作成します。しかし、後でテーブルtable2_nameを作成し、このビューに同じ方法で追加したいので、テーブルに行を追加するとビューに反映されます。私はtable2_nameに追加を行うときに、私は、コードの類似した部分を使用します(代わりに、インサートを使用)

INSERT INTO view_name SELECT * FROM table2_name 

しかし、今、これらは、ビューには反映されません。私はSQL(3日前に始まった)に非常に新しいので、私が見なければならない考えや場所は非常に高く評価されます。

(注:私は、SQL Serverを使用しています、私はこれが大きな違いを作ることを考えるようには見えませんが、場合にはそれがない)

おかげで、 SaxyTimmy

+3

特にビューでSELECT *を使用しないことを強くお勧めします。はい、入力するのは簡単ですが、後で問題が発生する可能性があります(特に、スキーマが進化している場合)。 SELECT *を使用すると、基になるテーブルを変更するたびにビューを更新する必要があります。必要な列は常に明示的に指定する必要があります。 –

+0

メタデータの分野でベンチャーに挑戦しているようですが、タグを付けたり、使用しているSQL Serverのバージョンを指定したりできますか?この情報は*常に*有効です。 –

+0

私はMS SQL Server 2008を使用しています。ごめんなさい – SaxyTimmy

答えて

3

あなたはデータを挿入することはできませんあなたができると思うやり方で見ることができます。 insert文を実行すると、ビューが参照する実表(table1_name)に実際にデータが挿入されます。ビューと行の間に何らかの種類のリンクを作成していません。table2_name

+0

ビューが参照する実表ですか?これは私の例ではtable1_nameでしょうか?私はこれを見て、新しいデータはここに追加されていません。 – SaxyTimmy

6

たぶんあなたがする何を意味するのか(列が同じであると仮定した場合):

ALTER VIEW view_name 
AS 
    SELECT col1, col2 FROM table1_name 
    UNION ALL 
    SELECT col1, col2 FROM table2_name 

ジョーが指摘したように、あなたはビューにデータを挿入していない - それが保持されません(それがインデックス化されていない限り、その場合は、ビューに実際には挿入しません)。

新しいテーブルのビューを更新する場合は、次のようにすることができます。私はあなたがSQL Server 2005以上であると仮定しています。もしあなたの学校があなたにSQL Server 2000を教えているのであれば、それは恥ずかしいものです。私はまた、他のいくつかのことを仮定しています...あなたのビューには、末尾のステートメントターミネーターが含まれていません(私は今までそれを残すことを主張する唯一の時間)、そしてあなたはコメントの前にすべての種類のナンセンスを持っていませんCREATE VIEWコマンド

CREATE PROCEDURE dbo.AddTableToView 
    @view  SYSNAME, 
    @new_table SYSNAME 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @sql NVARCHAR(MAX); 

    SELECT @sql = [definition] FROM sys.sql_modules 
     WHERE [object_id] = OBJECT_ID(@view); 

    SELECT @sql = STUFF(@sql, CHARINDEX('CREATE VIEW', @sql), 6, 'ALTER') 
     + 'UNION ALL 
      SELECT col1, col2 FROM ' + @new_table; 

    EXEC sp_executeSQL @sql; 
END 
GO 

しかし、私はコメントで示唆したように、これは本当にあなたが行きたかった方法ではありません、と私はあなたの教授が同じように感じるだろうと思います。

+0

これはかなり有望です。ただし、ビューに大量の表がある場合はどうなりますか?現在のビューにあるものを使用して追加する方法はありますか? – SaxyTimmy

+3

あなたはまだビューの概念を誤解していると思います。ビューにはデータがありません。テーブルのコピーではなく、テーブルへのポインタに過ぎません。または、毎回ビュー定義を再作成する必要がないことを意味しますか?あなたが実際のデータを意味するのか、テーブルへの参照を意味するのかにかかわらず、「ビュー内のテーブル」と言うと、私は苦労します。 –

+2

ビューに多数の同一テーブルを追加すると、データベース設計に問題があることを示すサインになる可能性があります。 –

3

私はあなたが正確にどのような見解があるのか​​誤解していると思います。ビューは基本的にはストアドクエリです。実際にビューに行を挿入するわけではありません。更新可能なビューを持つことはできますが、行を基になるテーブルに挿入しています。

table2_nameをビューに追加する場合は、そのビュー定義を変更する必要があります。

ALTER VIEW view_name 
AS 
    SELECT 
     * 
    FROM 
     table1_name 
    UNION ALL 
    SELECT 
     * 
    FROM 
     table2_name 

また、することができますDROPCREATE代わりALTER構文を使用しての新しい定義を持つビュー:列が正確にtable1_nameと一致するなら、あなたのような何かを行うことができます。

また、「私がtable1_nameに変更を加えた場合」と言えば、行を挿入したり列を追加したりすることを意味しますか?

+0

私は行を挿入することを意味します。私はVIEW_NAME FROM table1_name UNION ALL SELECT * FROM SELECT * ASこのメイクセンスを ALTERビューview_nameは をんやってみましたか?私は古いビューを維持し、この新しいテーブルを追加したいですか? ありがとう! – SaxyTimmy

+0

私は実際に自分自身にそれに答えることができます。いいえ、あなたがビューを自己参照することはできません。どのように私はそれに似た何かをすることができますか? – SaxyTimmy

+0

もう一度、ビューを間違った方法で見ています。それらは永続化されたテーブル/オブジェクトではありません。それらは単なるクエリ定義です。私が私の娘の家のビデオを作っていると想像してみてください。私はカメラのレンズに他の娘を描かない、私は両方の写真に合わせてカメラのビューを変更します。 –

2

ビューにデータを挿入することはできません。挿入物は、table1_nameテーブルにデータを挿入します。あなたはtable1_nametable2_nameの両方からのデータが必要な場合

Updatable and Insertable Viewsを参照)、その後、あなたは、ビューが作成されるに基づいてselecttable1_nametable2_nameの両方を持っている必要があります。 (あなたから照会テーブルの両方が同じ列なし/タイプ/セットを持っている場合)

あなたはそのために* いずれかUNIONを使用することができます。

CREATE VIEW view_name AS 
SELECT * FROM table1_name 
UNION 
SELECT * FROM table2_name 

これはtable1_nametable2_nameが同じを持っていることが必要です数と列の種類と同じ順序で

それともあなたが他のテーブルと結合し、すべての列(またはそれらのサブセット)を取得することができます:

* UNIONは、2つの選択クエリ間の重複を削除します。 UNION ALLは、両方のテーブルのデータが相互に排他的であることが確実である場合、または重複する行が問題ない場合は、より良いオプションです。 UNION ALLが優れています。

関連する問題