2017-11-13 20 views
0

私は4つの列を持つテーブルAを持っていると私はすべての4つの列で構成されている同じテーブルのビューを作成したとします。今私は新しい列が同じ物理的な順序でテーブルAに追加されるたびにビューコードを更新する必要があるスクリプト/ストアドプロシージャを記述したいと思います。SQLスクリプトを使用してビューコードを自動更新する方法は?

例について

: 表Aは、以下た列

'Name','Age','Gender','Address' 

想定ビューコードがある:私はスクリプト/ストアドプロシージャを実行する

Select Name,Age,Gender,Address from Table A 

が今は表Aに追加の列のPhoneNumberを追加しますこの新しい列は、次のようにクエリに自動的に追加されます。

スクリプトを実行した後に生成される必要なビューコードは、次のようになります。

Select Name,Age,Gender,Address,PhoneNumber from Table A  
+2

MySQLまたはMS SQL Serverを使用していますか? – jarlh

+0

@jarlh私はMS SQL Serverを使用しています。 –

+0

@AfzaalAhmad、そのデータベースはMicrosoft SQL Serverではないので、質問からMySQLタグを削除しました。 –

答えて

1

は、それはビューでselect *を使用してから、注意として

DECLARE @tablename as varchar(20) 
    DECLARE @query AS NVARCHAR(MAX) 
    DECLARE @ColumnName AS NVARCHAR(MAX) 
    set @tablename='tableName' 
    SELECT @ColumnName= ISNULL(@ColumnName + ',','') 
      + QUOTENAME(COLUMN_NAME) 
    FROM (SELECT COLUMN_NAME 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = @tablename 
       ) as ccc 
    set @query='select '[email protected]+' from '[email protected]+'' 
    EXEC (@query) 
+1

を使用するのではなく、すべての列を名前で指定する必要があります。これは必ずしも同じ物理的順序で列を返すわけではなく、[集合文字列の連結動作は未定義です。](https://stackoverflow.com/質問/ 44223465/string-aggregate-a-variableを参照してください)。 STRING_AGGはSQL 2017以降で最適なソリューションですが、以前のバージョンではFOR XMLが必要です。 –

+0

あなたの提案に感謝@DanGuzman.Iは実際にすべてのバージョンでこれを書いています。 –

1

私はあなたが、求めているものを理解していれば、あなたはそれがでコードを変更する代わりに、列を指定する必要がある理由viewへ:Viewが常に返されます。このように

SELECT * FROM TableA 

その表のすべての列。

+0

実際に私はそれぞれ3000カラムを持つ6つのテーブルを持っています。私はこのプロセスを自動化したいので、ストアドプロシージャを実行し、keytable、keyobjectをパラメータとして渡してコードを実際のカラムと同期させます。第2に、アーキテクチャ上の制約のために、* –

1

以下は、明示的な列リストを指定して、ビューを変更する例です。

REPRO:

CREATE TABLE t (id INT, NAME VARCHAR(10)) 
GO 
INSERT INTO t VALUES (1, 'a') 
GO 
CREATE VIEW v AS SELECT * FROM t 
GO 
SELECT * FROM v 
GO 
ALTER TABLE t ADD d DATE NOT NULL DEFAULT (GETDATE()) 
GO 
ALTER TABLE t DROP COLUMN id 
GO 
SELECT * FROM v 
GO 

DROP VIEW v 
GO 
DROP TABLE t 
GO 

enter image description here

1

サイドノートを働くことを願っています今の前に置くはこれを削除します。

SELECT * FROM v 
WHERE id = 3 

「」データ型intにvarchar型の値を変換するときに

の変換が失敗しますよ。

invalid object name idの代わりに。つまり、場合によってはソリューションは絶対に間違ったデータに依存し続けるでしょう

暗黙の変換を成功させるためにサンプルデータの 'a'を '3'に置き換えると、このコードは正常に動作し、いくつかのデータが返されます。 id=3はありませんでしたが、この選択を実行する時点では、物理的にもid列は全くありません。

関連する問題