最初に、構文は機能しません。
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つの列が異なる互換性のないデータ型の場合、クエリは失敗します。クエリが成功し、データベースに不正なデータがあるため、互換性のあるデータ型であれば悪化します。
その他の問題は、列名を指定しなかった場合、挿入する列の数が正確に同じである必要があります。一方の表に列を追加し、他方の表に列を追加しないと、問題が発生します。テーブルの中央から列を削除して列を追加すると、データ型に互換性がないか悪い場合にエラーの原因となる列のいくつかがマップされている列を変更すると、不良データが挿入される可能性があります。不正なデータを挿入することは、数週間から数か月間起きていることがわからない場合があるため、特に悪いことです。
最良の方法は、すべての列名を 'select'と' insert'の両方に明示的にリストすることです。物事を間違った順序で取得するリスクをなぜ実行するのですか? –
痛みを取り除くのに役立つSQL Serverツールがたくさんあります。たとえば、テーブルをManagement Studio SQLウィンドウにドラッグすると、すべてのフィールド名を含むSELECT文をすばやく作成できます。また、サーバー側で、あるテーブルから別のテーブルにデータをコピーする場合は、SSISのドラッグアンドドロップインターフェイスと列名の自動照合によって作業が楽になる場合があります。 –
無関係ですが、 'select'ステートメントの列リストのかっこはまったく役に立たないです。 –