web-dev-qa-db-ja.com

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

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

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

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

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

353
Daniel

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
589
OMG Ponies

あるテーブルから別のテーブルへのデータ挿入を実装する方法は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

参照 12

11
Somnath Muluk

それは以下に与えられるように働くでしょう:

insert into Gengl_Del Select Tdate,DocNo,Book,GlCode,OpGlcode,Amt,Narration 
from Gengl where BOOK='" & lblBook.Caption & "' AND DocNO=" & txtVno.Text & ""
4
Vinod Pareek
select *
into existing table database..existingtable
from database..othertables....

select * into tablename from other tablenamesを追加して使用したことがある場合は、select * into existing table tablename from other tablenamesと言います。

2
Verena_Techie

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

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
0
slayernoah