SQL Server CHỌN vào bảng hiện có


384

Tôi đang cố gắng chọn một số trường từ một bảng và chèn chúng vào một bảng hiện có từ một thủ tục được lưu trữ. Đây là những gì tôi đang cố gắng:

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

Tôi nghĩ SELECT ... INTO ...là cho các bảng tạm thời đó là lý do tại sao tôi nhận được một lỗi dbo.TableTwođã tồn tại.

Làm thế nào tôi có thể chèn nhiều hàng từ dbo.TableOnevào dbo.TableTwo?


29
Vì bạn đã chấp nhận câu trả lời, tôi chỉ muốn đưa ra một lưu ý: Chọn vào không phải là "cho các bảng tạm thời", nó là để tạo một bảng mới dựa trên cấu trúc (và dữ liệu) của phần chọn của truy vấn . Đối với bảng X, bạn chỉ có thể chọn Tối đa 1 lần *, sau đó bạn cần sử dụng Chèn vào để nối thêm bất kỳ dữ liệu nào. * Nếu bảng đã tồn tại, thì không có lần nào. Điều này là tất nhiên trừ khi bạn DROP bảng đầu tiên.
Pinkfloydx33

8
nhưng lưu ý rằng Chọn vào không sao chép các ràng buộc về chỉ mục / khóa chính / khóa ngoại, do đó, nó sẽ khiến bạn có một đống dữ liệu không được giải thích. Nó hữu ích cho công việc phát triển nhanh, nhưng không phải là cách để thêm / di chuyển một bảng sản xuất thực sự.
Graham Griffiths

chỉ cần chạy câu lệnh này 'thả bảng tabletwo;' và chạy truy vấn trên. Chọn ... vào không cho các bảng tạm thời.
Shiwangini

Câu trả lời:


637

SELECT ... INTO ... chỉ hoạt động nếu bảng được chỉ định trong mệnh đề INTO không tồn tại - nếu không, bạn phải sử dụng:

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

Giả định này chỉ có hai cột trong dbo.TABLETWO - bạn cần chỉ định các cột khác:

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

52
Đó là một cách thực hành tốt nhất để luôn chỉ định các cột bất kể chúng có ở đó hay không. Nó sẽ giúp ngăn chặn mọi thứ bị phá vỡ khi ai đó thêm một cột.
HLGEM

1
Hmm, SELECT... INTO...câu lệnh dường như không hoạt động nếu bảng được chỉ định trong INTOmệnh đề chưa tồn tại. Tôi nhận được một lỗi "biến không khai báo". Mặc dù có lẽ vấn đề này chỉ dành cho MySQL. Cái CREATE TABLE ... LIKE .. worked;
LazerSharks

1
@Gnuey CHỌN ... VÀO ... chỉ hoạt động nếu có bảng hiện có. Nếu không có bảng hiện có, hãy sử dụng định dạng của người đăng ban đầu (sẽ tạo bảng mới)
Sẽ

6
@ Bạn có nghĩa là trái ngược với những gì bạn nói? ´SELECT ... VÀO ... ắc yêu cầu một bảng không tồn tại được chỉ định, trong khi ´INININ VÀO ... ượng yêu cầu một bảng hiện có được chỉ định.
André C. Andersen

5
Tôi ước có một bộ đếm cho số lần tôi kiểm tra lại và sử dụng câu trả lời này!
MTAdmin

13

Có hai cách khác nhau để thực hiện chèn dữ liệu từ bảng này sang bảng khác.

Đối với Bảng hiện có - XÁC NHẬN VÀO CHỌN

Phương pháp này được sử dụng khi bảng đã được tạo trong cơ sở dữ liệu trước đó và dữ liệu sẽ được chèn vào bảng này từ bảng khác. Nếu các cột được liệt kê trong mệnh đề chèn và mệnh đề chọn giống nhau, chúng không bắt buộc phải liệt kê chúng. Đó là một thực hành tốt để luôn luôn liệt kê chúng cho mục đích dễ đọc và khả năng mở rộng.

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

Đối với bảng không tồn tại - CHỌN VÀO

Phương pháp này được sử dụng khi bảng không được tạo trước đó và cần được tạo khi dữ liệu từ một bảng được chèn vào bảng mới được tạo từ bảng khác. Bảng mới được tạo với cùng loại dữ liệu với các cột được chọn.

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

Tham chiếu 1 2


3

Nó sẽ hoạt động như được đưa ra dưới đây:

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

5
+1 để chống lại -1 và cho nỗ lực đưa ra ý tưởng có thể được sử dụng hoặc được người dùng khác tham khảo. @MarkSowul là quyền của SQL, nhưng vì mục đích học thuật, người khác có thể thử phương pháp đó.
Albert Laure

1
Hầu hết các bảng đều có trường tăng tự động, không thể chèn được. Vì vậy, SELECT *sẽ không làm việc. Đây là một cách tốt hơn, cảm ơn!
MJH

2
@ User6675636b20796f7521 Tôi sẽ không đi xa đến mức đề nghị người khác thử phương pháp đó, nếu đó là phương pháp tiêm SQL mà chúng ta đang nói đến. Nó không bao giờ nên được thực hiện, và do đó không bao giờ được thử. Sẽ hiệu quả hơn nhiều khi chỉnh sửa câu trả lời này cho thấy cách chính xác để làm điều này ngay từ đầu, và nếu có ai hỏi, "những gì có dấu hỏi / tại các biểu tượng?" bạn chỉ cần trả lời, "đó là những dấu tham số để sử dụng trong các truy vấn được tham số hóa (ngoài phạm vi)" và để chúng tìm ra từ đó.
Matt Borja

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

Nếu bạn đã sử dụng select * into tablename from other tablenames, lần sau, để chắp thêm, bạn nóiselect * into existing table tablename from other tablenames


2
PS đã thử nghiệm trên SYBASE ASE 15,5
Verena_Techie

10
OP đang yêu cầu MS SQL.
GrandMasterFlush

1

Nếu bảng đích tồn tại nhưng bạn không muốn chỉ định tên cột:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.