3

非常に多数のフィールドを持つテーブルがあり、そのテーブルはINSERT INTO ... SELECTクエリによって入力されています。フィールドの数が非常に多いため、次のようになります。

INSERT INTO MyTable (
                column1,
                colunm2,
                colunm3,
                ...
                column200)
SELECT column1,
       column2,
       column3,
       ...
       column200
  FROM SomeView;

SELECT上記はメンテナンスが面倒でエラーが発生しやすいため、句のフィールド名がターゲットテーブルの同じ名前のフィールドにマップされる、ある種の「自然な挿入」が可能であればよいと思います。

私はこれを試しました:

INSERT INTO MyTable
SELECT column1,
       column2,
       column3,
       ...
       column200
  FROM SomeView;

どちらが構文的に正しいのですが、フィールドの順序の一致に依存しているため、さらにエラーが発生しやすくなります。どうすればよいでしょうか? もっと明白な 3 番目のオプションを見落としていませんか?

明確化: 目的は、長期的にコードを維持しやすくすることです。このステートメントは何度も更新される予定なので、より読みやすく、変更しやすい方法を探しています。

4

3 に答える 3

2

動的 SQL を使用して、insert ステートメントを生成する (または同時に実行する) クエリを自分で作成できます。

DECLARE @cols VARCHAR(MAX)
SELECT @cols = 
    STUFF( (SELECT ', ' + name 
            FROM sys.columns 
            WHERE object_id = object_id('MyTable') 
          FOR XML PATH('')),1,1,'')

DECLARE @sql VARCHAR(MAX)
SELECT @sql = 'INSERT INTO MyTable (' + @cols + ') 
               SELECT ' + @cols + ' FROM SomeView'

--print the statement and copy/paste it for saving or using
PRINT (@sql)

--or just execute it right here
EXEC (@sql)
于 2013-08-27T08:29:55.157 に答える
1

上記を高速化するためにできることの 1 つはColumns、SSMS の値を新しいクエリにドラッグすることです。エディターには、すべての列名が 1 行に表示されます。

そう

INSERT INTO MyTable
SELECT

列をドラッグ

FROM SomeView;

列はカンマ区切りのリストとして表示されます。必要に応じて [] が欠落している場合がありますが、入力するよりも高速です。

于 2013-08-27T08:24:41.747 に答える