2010-07-17 37 views
16

Đây phải là một câu hỏi khá đơn giản, nhưng tôi không thể tìm thấy câu trả lời trực tuyến vững chắc. Tôi đang cố chèn nhiều hàng vào cùng một bảng, nhưng chỉ với một câu lệnh. Phổ biến nhất mà tôi đã thấy trực tuyến là như sau, nhưng tôi đã đọc rằng nó chỉ hoạt động với SQL Server 2008:SQL Server 2005: Chèn nhiều hàng với một truy vấn đơn

INSERT INTO Table (Name, Location) VALUES 
('Name1', 'Location1'), 
('Name2', 'Location2'), 
('Name3', 'Location3'), etc... 

Tôi muốn phương pháp này nếu nó sẽ làm việc với SQL Server 2005, nhưng tôi không nghĩ rằng nó sẽ. Một lựa chọn khác, từ những gì tôi đã đọc, phải làm với các câu lệnh SELECT sau đây của UNION ALL sau khi INSERT, có vẻ như rất khó. Có ai biết chắc chắn cú pháp tốt nhất để làm điều này trong năm 2005?

Cảm ơn.

Trả lời

21

Đúng. Bạn phải sử dụng UNION ALL s trong SQL Server 2005 để chèn nhiều hàng trong một tập lệnh SQL trong một câu lệnh duy nhất.

INSERT INTO Table 
    (Name, Location) 
SELECT 'Name1', 'Location1' 
UNION ALL 
SELECT 'Name2', 'Location2' 
UNION ALL 
SELECT 'Name3', 'Location3' 

Cách thay thế chính khác là lặp lại tuyên bố Insert nhiều lần thậm chí còn dài dòng hơn. Bạn cần phải cẩn thận khi sử dụng các giao dịch rõ ràng trong trường hợp cuối cùng này để tránh chi phí của nhiều cam kết riêng lẻ (và vì lý do nguyên tử)

Nếu bạn có nhiều hàng để chèn, bạn có thể sử dụng BULK INSERT để tải tất cả từ một tệp được phân tách trong một câu lệnh.

Cuối cùng nếu đây là dữ liệu đã có trong cơ sở dữ liệu mà bạn đang viết (có thể triển khai trên máy chủ khác), thì hàm bổ sung SSMS Tools Pack có chức năng "Tạo lệnh chèn" có thể tạo các câu lệnh này cho bạn.

+1

Đối với hồ sơ, bạn sẽ nhớ cách gõ ra một ví dụ sử dụng UNION TẤT CẢ CÁC? –

3

Bạn phải sử dụng union all trong máy chủ sql 2005. Thành thật mà nói, điều đó rất khó khăn và xấu xí, tôi chỉ sử dụng nhiều inserts nếu tôi là bạn. Gói chúng trong một giao dịch duy nhất và cuối cùng cũng giống như vậy.

1

Có họ những lựa chọn duy nhất của bạn, trừ khi bạn đang chèn rất nhiều dữ liệu và có thể muốn khám phá một BULK INSERT

INSERT INTO Table (Name, Location) 
SELECT 'Name1', 'Location1' UNION ALL 
SELECT 'Name2', 'Location2' UNION ALL 
SELECT 'Name3', 'Location3' 
5

Như những người khác đã nói, chìa khóa ở đây là UNION ALL. Đối với tôi, việc sử dụng CTE giúp mọi thứ trông sạch hơn một chút, ví dụ:

WITH NewStuff (Name, Location) 
    AS 
    (
     SELECT 'Name1', 'Location1' UNION ALL 
     SELECT 'Name2', 'Location2' UNION ALL 
     SELECT 'Name3', 'Location3' 
    ) 
INSERT INTO Stuff (Name, Location) 
SELECT Name, Location 
    FROM NewStuff; 
0

Vì MS SQLServer 2005 hỗ trợ XML là phương pháp tốt nhất tôi đề xuất là một thủ tục lưu trữ với tham số đầu vào của loại XML. Nếu bạn đang làm việc với .NET, bạn có thể dễ dàng chuyển đổi DataSet để chuỗi xml sử dụng phương pháp ds.GetXml() và có thể được gửi đến SP

CREATE PROCEDURE [dbo].[insertLocation](@XML XML=NULL) 
AS 
BEGIN 
    INSERT INTO [dbo].[TheLocations] 
     ([Name], [Location]) 
    SELECT 
     XTab.value('Name[1]','nvarchar(100)') AS[Name], 
     XTab.value('Location[1]','nvarchar(200)') AS[Location] 
    FROM @XML.nodes('TheLocations') XTab([XTab]) 
END 
Các vấn đề liên quan