既存のテーブルへのSQL Server SELECT


384

1つのテーブルからいくつかのフィールドを選択し、それらをストアドプロシージャから既存のテーブルに挿入しようとしています。これが私が試していることです:

SELECT col1, col2
INTO dbo.TableTwo 
FROM dbo.TableOne 
WHERE col3 LIKE @search_key

SELECT ... INTO ...一時テーブル用だと思うので、dbo.TableTwoすでに存在するエラーが発生します。

からdbo.TableOneに複数の行を挿入するにはどうすればよいdbo.TableTwoですか?


29
あなたはすでに答えを受け入れたので、私はただメモを提供したいと思いました:Select Intoは「一時テーブル用」ではなく、クエリの選択部分の構造(およびデータ)に基づいて新しいテーブルを作成するためのものです。テーブルXの場合、選択できるのは最大1回*までです。その後、Insert Intoを使用してデータを追加する必要があります。*テーブルがすでに存在する場合は、ゼロ回。最初にテーブルを削除しない限り、これはもちろんです。
pinkfloydx33 2010年

8
ただし、Select Intoはインデックス/主キー/外部キーの制約をコピーしないため、インデックス付けされていないheap-o-dataが残ることに注意してください。迅速な開発作業には役立ちますが、実際の本番テーブルを追加/移動する方法には役立ちません。
グラハムグリフィス

このステートメント「drop table tabletwo;」を実行するだけです。上記のクエリを実行します。Select ... intoは一時テーブル用ではありません。
Shiwangini、

回答:


637

SELECT ... INTO ... INTO句で指定されたテーブルが存在しない場合にのみ機能します。それ以外の場合は、以下を使用する必要があります。

INSERT INTO dbo.TABLETWO
SELECT col1, col2
  FROM dbo.TABLEONE
 WHERE col3 LIKE @search_key

これは、dbo.TABLETWOに2つの列しかないことを前提としています。それ以外の場合は列を指定する必要があります。

INSERT INTO dbo.TABLETWO
  (col1, col2)
SELECT col1, col2
  FROM dbo.TABLEONE
 WHERE col3 LIKE @search_key

52
列がすべてあるかどうかに関係なく、常に列を指定することをお勧めします。これは、誰かが列を追加したときに物事が壊れることを防ぐのに役立ちます。
HLGEM 2013

1
うーん、節でSELECT... INTO...指定されたテーブルINTOがまだ存在しない場合、ステートメントは機能しないようです。「宣言されていない変数」エラーが発生します。たぶん、この問題はMySQLのみに関するものです。CREATE TABLE ... LIKE .. worked;
LazerSharks 2013

1
@Gnuey SELECT ... INTO ...は、既存のテーブルがある場合にのみ機能します。既存のテーブルがない場合は、元のポスターの形式を使用します(これにより、新しいテーブルが作成されます)
Will

6
@あなたはあなたが言ったことの反対を意味しましたか?「SELECT ... INTO ...」には、存在しないテーブルを指定する必要がありますが、「INSERT INTO ...」には、既存のテーブルを指定する必要があります。
アンドレC.アンデルセン

5
チェックしてこの回答を使用した回数のカウンターがあったらいいのですが!
MTAdmin 2017

13

あるテーブルから別のテーブルへのデータの挿入を実装するには、2つの異なる方法があります。

既存のテーブルの場合-INSERT INTO SELECT

この方法は、テーブルがすでにデータベースに作成されており、データが別のテーブルからこのテーブルに挿入される場合に使用されます。insert節とselect節にリストされている列が同じである場合、それらをリストする必要はありません。読みやすさとスケーラビリティの目的で、常にそれらをリストすることをお勧めします。

----Create testable
CREATE TABLE TestTable (FirstName VARCHAR(100), LastName VARCHAR(100))
----INSERT INTO TestTable using SELECT
INSERT INTO TestTable (FirstName, LastName)
SELECT FirstName, LastName
FROM Person.Contact
WHERE EmailPromotion = 2
----Verify that Data in TestTable
SELECT FirstName, LastName
FROM TestTable
----Clean Up Database
DROP TABLE TestTable

存在しないテーブルの場合-SELECT INTO

このメソッドは、テーブルが以前に作成されておらず、あるテーブルのデータを別のテーブルから新しく作成されたテーブルに挿入するときに作成する必要がある場合に使用されます。新しいテーブルは、選択した列と同じデータ型で作成されます。

----Create a new table and insert into table using SELECT INSERT
SELECT FirstName, LastName
INTO TestTable
FROM Person.Contact
WHERE EmailPromotion = 2
----Verify that Data in TestTable
SELECT FirstName, LastName
FROM TestTable
----Clean Up Database
DROP TABLE TestTable

参照1 2


3

以下のように動作します:

insert into Gengl_Del Select Tdate,DocNo,Book,GlCode,OpGlcode,Amt,Narration 
from Gengl where BOOK='" & lblBook.Caption & "' AND DocNO=" & txtVno.Text & ""

5
+1は-1に対抗し、他のユーザーが使用または参照できるアイデアを提供するために使用します。@MarkSowulはSQLインジェクションの権利ですが、学術目的のために他の人がそのような方法を試すことができます。
Albert Laure 2013

1
ほとんどのテーブルには、挿入できない自動インクリメントフィールドがあります。だからSELECT *動作しません。これはより良い方法です、ありがとう!
MJH 2016年

2
@ User6675636b20796f7521私たちが話しているSQLインジェクションであれば、他の人がその種のメソッドを試すことが「大丈夫」だと提案することはあまりありません。それは決して行われるべきではないので、決して試みられるべきではありません。最初から正しい方法を示してこの回答を編集し、誰かが質問した場合、「疑問符/アットマークは何ですか?」と編集する方がはるかに生産的です。「これらはパラメーター化されたクエリで使用するためのパラメーターマーカーです(範囲外)」と返信し、そこからそれを理解させます。
Matt Borja 2016年

2
select *
into existing table database..existingtable
from database..othertables....

あなたがselect * into tablename from other tablenamesすでに使用している場合は、次回、追加するために、あなたは言うselect * into existing table tablename from other tablenames


2
PSはSYBASE ASE 15.5でテスト済み
Verena_Techie 2013

10
OPはMS SQLを求めています。
GrandMasterFlush 2013

1

宛先テーブルは存在するが、列名を指定したくない場合:

DECLARE @COLUMN_LIST NVARCHAR(MAX);
DECLARE @SQL_INSERT NVARCHAR(MAX);

SET @COLUMN_LIST = (SELECT DISTINCT
    SUBSTRING(
        (
            SELECT ', table1.' + SYSCOL1.name  AS [text()]
            FROM sys.columns SYSCOL1
            WHERE SYSCOL1.object_id = SYSCOL2.object_id and SYSCOL1.is_identity <> 1
            ORDER BY SYSCOL1.object_id
            FOR XML PATH ('')
        ), 2, 1000)
FROM
    sys.columns SYSCOL2
WHERE
    SYSCOL2.object_id = object_id('dbo.TableOne') )

SET @SQL_INSERT =  'INSERT INTO dbo.TableTwo SELECT ' + @COLUMN_LIST + ' FROM dbo.TableOne table1 WHERE col3 LIKE ' + @search_key
EXEC sp_executesql @SQL_INSERT
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.