기존 테이블에 SQL Server SELECT


384

하나의 테이블에서 일부 필드를 선택하고 저장 프로 시저에서 기존 테이블에 삽입하려고합니다. 여기 내가 시도하는 것이 있습니다 :

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

생각 SELECT ... INTO ...나는 오류 얻을 이유입니다 임시 테이블입니다 dbo.TableTwo이미 존재합니다.

어떻게에서 여러 행을 삽입 할 수 있습니다 dbo.TableOnedbo.TableTwo?


29
이미 답변을 수락 했으므로 다음과 같은 메모를 제공하고 싶었습니다. Select Into는 "임시 테이블 용"이 아니며 쿼리의 선택 부분의 구조 (및 데이터)를 기반으로 새 테이블을 생성하기위한 것입니다. . 표 X의 경우 최대 1 회까지만 선택할 수 있습니다. 그 후에는 데이터를 추가하기 위해 Insert Into를 사용해야합니다. * 테이블이 이미 존재하면 0 번입니다. 테이블을 먼저 삭제하지 않는 한 이것은 물론입니다.
pinkfloydx33

8
그러나 Select Into는 인덱스 / 기본 키 / 외래 키 제약 조건을 복사하지 않으므로 인덱싱되지 않은 heap-o-data가 남습니다. 빠른 개발 작업에는 유용하지만 실제 프로덕션 테이블을 추가 / 이동할 수는 없습니다.
Graham Griffiths

이 문장을 'drop table tabletwo;' 위의 쿼리를 실행하십시오. 임시 테이블이 아닌 경우를 선택하십시오.
Shiwangini

답변:


637

SELECT ... INTO ... INTO 절에 지정된 테이블이 존재하지 않는 경우에만 작동합니다. 그렇지 않으면 다음을 사용해야합니다.

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

이것은 dbo.TABLETWO에 두 개의 열만 있다고 가정합니다. 그렇지 않으면 열을 지정해야합니다.

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

52
열이 모두 있는지 여부에 관계없이 항상 열을 지정하는 것이 가장 좋습니다. 누군가가 열을 추가 할 때 깨지지 않도록 도와줍니다.
HLGEM

1
흠, 절에 SELECT... INTO...지정된 테이블이 없으면 명령문이 작동하지 않는 것 같습니다 INTO. "선언되지 않은 변수"오류가 발생합니다. 어쩌면이 문제는 MySQL에만 해당됩니다. CREATE TABLE ... LIKE .. worked;
LazerSharks

1
@Gnuey SELECT ... INTO ... 기존 테이블이있는 경우에만 작동합니다. 기존 테이블이없는 경우 원래 포스터 형식을 사용하여 새 테이블을 만듭니다.
Will

6
@ 윌 당신이 말한 것과 반대의 의미입니까? ´SELECT ... INTO ... ´는 존재하지 않는 테이블을 지정하고 INSERT INTO ... ´는 기존 테이블을 지정해야합니다.
André C. Andersen

5
다시 확인 하고이 답변을 사용하는 횟수에 대한 카운터가 있었기를 바랍니다.
MTAdmin

13

한 테이블에서 다른 테이블로 데이터 삽입을 구현하는 두 가지 방법이 있습니다.

기존 테이블의 경우-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

1
대부분의 테이블에는 자동 증분 필드가있어 삽입 할 수 없습니다. 그래서 SELECT *작동하지 않습니다. 이것은 더 좋은 방법입니다, 감사합니다!
MJH

2
우리가 말하는 SQL 인젝션이라면 다른 사람들이 그런 종류의 방법을 시도하는 것이 "괜찮아"라고 제안하기까지는 가지 않을 것입니다. 절대로 수행해서는 안되므로 시도하지 마십시오. 이 답변을 처음부터 올바르게 수행 하는 올바른 방법을 보여주는이 답변을 편집하는 것이 훨씬 생산적 이며, 누군가가 "물음표 / 기호는 무엇입니까?" "이것은 매개 변수화 된 쿼리에서 사용하기위한 매개 변수 표시 문자입니다 (범위 밖)"라고 간단히 대답하고 거기서부터 알아낼 수있게합니다.
Matt Borja

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

10
OP가 MS SQL을 요청하고 있습니다.
GrandMasterFlush

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.