SQL Server SELECT ลงในตารางที่มีอยู่


384

ฉันกำลังพยายามเลือกเขตข้อมูลจากตารางหนึ่งและแทรกลงในตารางที่มีอยู่จากกระบวนงานที่เก็บไว้ นี่คือสิ่งที่ฉันพยายาม:

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 ครั้ง * หลังจากนั้นคุณต้องใช้แทรกเข้าไปเพื่อผนวกข้อมูลใด ๆ * หากตารางมีอยู่แล้วแสดงว่ามีศูนย์ครั้ง นี่เป็นของหลักสูตรเว้นแต่คุณจะวางโต๊ะก่อน
pinkfloydx33

8
แต่โปรดทราบว่า Select Into ไม่ได้คัดลอกดัชนี / คีย์หลัก / ข้อ จำกัด คีย์ต่างประเทศดังนั้นมันจะทำให้คุณมี heap-o-data ที่ไม่ได้จัดทำดัชนี มันมีประโยชน์สำหรับงาน dev ที่รวดเร็ว แต่ไม่ใช่วิธีการเพิ่ม / ย้ายตารางการผลิตจริง
Graham Griffiths

เพียงแค่เรียกใช้คำสั่งนี้ 'วางตาราง 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 เท่านั้น The CREATE TABLE ... LIKE .. worked;
LazerSharks

1
@Gnuey SELECT ... เข้า ... จะทำงานเฉพาะเมื่อมีตารางที่มีอยู่ หากไม่มีตารางที่มีอยู่ให้ใช้รูปแบบของโปสเตอร์ต้นฉบับ (ที่จะสร้างตารางใหม่)
จะ

6
@Will คุณหมายถึงสิ่งที่ตรงกันข้ามกับที่คุณพูดหรือไม่ EL เลือก ... เข้าสู่ ... ´ต้องการระบุตารางที่ไม่มีอยู่ในขณะที่´ INSERT เข้า ... ´ต้องการให้มีการระบุตารางที่มีอยู่
André C. Andersen

5
ฉันหวังว่าจะมีเคาน์เตอร์สำหรับจำนวนครั้งที่ฉันกลับมาตรวจสอบและใช้คำตอบนี้!
MTAdmin

13

มีสองวิธีที่แตกต่างกันในการนำการแทรกข้อมูลจากตารางหนึ่งไปยังอีกตารางหนึ่ง

สำหรับตารางที่มีอยู่ - INSERT INTO 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

สำหรับตารางที่ไม่มีอยู่ - เลือกเป็น

วิธีนี้ใช้เมื่อไม่ได้สร้างตารางก่อนหน้านี้และจะต้องสร้างขึ้นเมื่อข้อมูลจากตารางหนึ่งถูกแทรกลงในตารางที่สร้างขึ้นใหม่จากตารางอื่น ตารางใหม่จะถูกสร้างด้วยชนิดข้อมูลเดียวกับคอลัมน์ที่เลือก

----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 แต่เพื่อประโยชน์ด้านการศึกษาคนอื่น ๆ สามารถลองวิธีการแบบนั้นได้
อัลเบิร์ต Laure

1
ตารางส่วนใหญ่มีฟิลด์การเพิ่มอัตโนมัติซึ่งไม่สามารถแทรกได้ ดังนั้นSELECT *จะไม่ทำงาน นี่เป็นวิธีที่ดีกว่านี้ขอบคุณ!
MJH

2
@ User6675636b20796f7521 ฉันจะไม่ไปไกลถึงการแนะนำว่า "โอเค" สำหรับคนอื่นที่จะลองวิธีการแบบนั้นถ้ามันเป็นการฉีด 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
ป.ล. ทดสอบบน 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.