2016-12-06 12 views
0

の選択列の値を挿入する簡単な方法を探しています。SELECT *:INSERT - 代わりに、1列

TableA TABLEB 
----------------- 
Field1 Field1 
Field2 Field2 
Field3 Field3 
Field4 Field4 
Field5 Field5 
      FleldX 

は私のテーブルには、約80の列が含まれています。

Insert Into table B (Field1, Field2, Field3, Field4, Field5, FieldX) 
VALUES SELECT (Field1, Field2, Field3, Field4, Field5, 'HARDCODEVALUE') 
     FROM TableA 

が、私はそれが自動的にフィールドをマップので、私はこのように設定することができるかどうかだろう、すべての80人の列名、または最善の解決策を明示的に設定する必要があります:今、私はちょうど同じように、別のテーブルからデータをコピーしたいです

Insert Into table B (Field1, Field2, Field3, Field4, Field5, FieldX) 
VALUES 
    SELECT (Field4, Field3, Field2, Field1, Field5, 'HARDCODEVALUE' AS FieldX) 
    FROM TableA 

どこで列名を並べ替えることができますか?

どのような方法を使用するのが最適ですか?

+9

最良の方法は、すべての列名を 'select'と' insert'の両方に明示的にリストすることです。物事を間違った順序で取得するリスクをなぜ実行するのですか? –

+0

痛みを取り除くのに役立つSQL Serverツールがたくさんあります。たとえば、テーブルをManagement Studio SQLウィンドウにドラッグすると、すべてのフィールド名を含むSELECT文をすばやく作成できます。また、サーバー側で、あるテーブルから別のテーブルにデータをコピーする場合は、SSISのドラッグアンドドロップインターフェイスと列名の自動照合によって作業が楽になる場合があります。 –

+1

無関係ですが、 'select'ステートメントの列リストのかっこはまったく役に立たないです。 –

答えて

1

最初に、構文は機能しません。

INSERT INTO tableB (Field1, Field2, Field3, Field4, Field5, FieldX) 
SELECT Field4, Field3, Field2, Field1, Field5, 'HARDCODEVALUE' AS FieldX 
FROM TableA 

次を試してみてくださいはい、あなたはいつもあなたがテーブルに両方を選択し、挿入中にそれらを挿入するために、すべての列を使用する必要があります。これを行うには、非常に大きなSQLの反パターンがあります。特に、列が変化している場合は、問題が発生する可能性があります。常に、右の列が右の列に一致するようにします。フィールド名が常に直接一致するとは限らない場合、これはさらに問題になります。

テーブル構造が毎日構造を変更する場合は、決して起こらないように設計上の問題があります。

私はあなたがその場でカラムを見つけるためにinformationschemaテーブルを使用することを提案できますが、tableAがカラムを追加する場合、どのカラムをtableBにマップするかをどのように知っていますか?列がtableBから削除された場合、どの列をSELECT内のTableAから削除するかを知る方法はありますか?問題を説明しましょう。

は、あなたがこのような構造を持っているとします

TABLEA 
USERID 
USERLOGIN 
USERPASSWORD 

TABLEB 
USERID 
SYSLOGIN 
SYSPASSWORD 
USERTYPE 

は、この時点で、すべてがうまくある

INSERT INTO tableB (USERID,SYSLOGIN,SYSPASSWORD,USERTYPE) 
SELECT USERID,USERLOGIN,USERPASSWORD, 'User' AS USERTYPE 
FROM TableA 

のと同じです

INSERT INTO tableB 
SELECT *, 'User' AS USERTYPE 
FROM TableA 

を挿入* SELECTを見ています。しかし、構造が変わるとどうなりますか?

次に構造が

TABLEA 
USERID 
USERLOGIN 
USERPASSWORD 
LASTLOGINDATE 

TABLEB 
USERID 
SYSLOGIN 
SYSPASSWORD 
USERTYPE 
LASTLOGINDATE 

あなたが選択使用している場合、あなたは終わり、SELECT *を使用することによって、見ることができるように*

INSERT INTO tableB 
SELECT * 
FROM TableA 

INSERT INTO tableB (USERID,SYSLOGIN,SYSPASSWORD,USERTYPE, LASTLOGINDATE) 
SELECT USERID,USERLOGIN,USERPASSWORD, LASTLOGINDATE,'User' AS USERTYPE 
FROM TableA 

のと等価であるとなりLASTLOGINDATEをUSERTYPEに挿入しようとしました。以前にUSERTYPEをハードコーディングした値がLASTになりましたLOGINDATE。これは、列を指定しないと、SQLサーバーが列を指定するためです。最後の2つの列が異なる互換性のないデータ型の場合、クエリは失敗します。クエリが成功し、データベースに不正なデータがあるため、互換性のあるデータ型であれば悪化します。

その他の問題は、列名を指定しなかった場合、挿入する列の数が正確に同じである必要があります。一方の表に列を追加し、他方の表に列を追加しないと、問題が発生します。テーブルの中央から列を削除して列を追加すると、データ型に互換性がないか悪い場合にエラーの原因となる列のいくつかがマップされている列を変更すると、不良データが挿入される可能性があります。不正なデータを挿入することは、数週間から数か月間起きていることがわからない場合があるため、特に悪いことです。

関連する問題