Chèn dữ liệu
Transact-SQL cung cấp nhiều cách để chèn hàng vào bảng.
Câu lệnh INSERT
Câu lệnh INSERT được dùng để thêm một hoặc nhiều hàng vào bảng. Có một số hình thức của tuyên bố.
Cú pháp cơ bản của một câu lệnh INSERT đơn giản được hiển thị dưới đây:
INSERT [INTO] <Table> [(column_list)]
VALUES ([ColumnName or an expression or DEFAULT or NULL],…n)
Với biểu mẫu này của câu lệnh INSERT, được gọi là CHÈN GIÁ TRỊ, bạn có thể chỉ định các cột sẽ có các giá trị được đặt trong chúng và thứ tự mà dữ liệu sẽ được trình bày cho mỗi hàng được chèn vào bảng. Tùy column_list tùy chọn nhưng được đề xuất. Nếu không có column_list, câu lệnh INSERT sẽ mong đợi giá trị cho mọi cột trong bảng theo thứ tự xác định các cột. Bạn cũng có thể cung cấp giá trị cho các cột đó dưới dạng danh sách được phân tách bằng dấu phẩy.
Khi liệt kê các giá trị, từ khóa DEFAULT có nghĩa là giá trị được xác định trước, được xác định khi tạo bảng, sẽ được sử dụng. Có ba cách để xác định mặc định:
- Nếu một cột đã được xác định có giá trị được tạo tự động, giá trị đó sẽ được sử dụng. Các giá trị tự động tạo sẽ được thảo luận sau trong mô-đun này.
- Khi tạo bảng, một giá trị mặc định có thể được cung cấp cho một cột và giá trị đó sẽ được sử dụng nếu DEFAULT được chỉ định.
- Nếu một cột đã được xác định để cho phép các giá trị NULL và cột đó không phải là cột tự động tạo ra và không được xác định theo mặc định, NULL sẽ được chèn dưới dạng MẶC ĐỊNH.
Chi tiết về việc tạo bảng nằm ngoài phạm vi của mô-đun này. Tuy nhiên, việc xem các cột trong bảng thường rất hữu ích. Cách dễ nhất là chỉ thực thi câu lệnh SELECT trên bảng mà không trả về bất kỳ hàng nào. Bằng cách sử dụng điều kiện WHERE không bao giờ là TRUE, không hàng nào có thể được trả về.
SELECT * FROM Sales.Promotion
WHERE 1 = 0;
Câu lệnh này sẽ hiển thị cho bạn tất cả các cột và tên của chúng, nhưng sẽ không hiển thị các kiểu dữ liệu hoặc bất kỳ thuộc tính nào, chẳng hạn như liệu NULLs được cho phép hay không hoặc nếu có giá trị mặc định được chỉ định. Ví dụ về đầu ra từ truy vấn có thể trông như sau:
Tên Khuyến mãi
Ngày bắt đầu
ProductModelID
Giảm giá
Ghi chú
Để chèn dữ liệu vào bảng này, bạn có thể sử dụng câu lệnh INSERT như minh họa ở đây.
INSERT INTO Sales.Promotion (PromotionName,StartDate,ProductModelID,Discount,Notes)
VALUES
('Clearance Sale', '01/01/2021', 23, 0.1, '10% discount');
Đối với ví dụ này ở trên, danh sách cột có thể được bỏ qua, vì chúng tôi đang cung cấp một giá trị cho mỗi cột theo thứ tự chính xác:
INSERT INTO Sales.Promotion
VALUES
('Clearance Sale', '01/01/2021', 23, 0.1, '10% discount');
Giả sử bảng được xác định sao cho giá trị mặc định của ngày hiện tại được áp dụng cho cột Ngày_Bắt_đầu và cột Ghi chú cho phép giá trị NULL. Bạn có thể cho biết rằng bạn muốn sử dụng các giá trị này một cách rõ ràng, như thế này:
INSERT INTO Sales.Promotion
VALUES
('Pull your socks up', DEFAULT, 24, 0.25, NULL);
Ngoài ra, bạn có thể bỏ qua các giá trị trong câu lệnh INSERT, trong trường hợp này, giá trị mặc định sẽ được sử dụng nếu được xác định và nếu không có giá trị mặc định nhưng cột cho phép NULLs thì sẽ chèn NULL. Nếu bạn không cung cấp giá trị cho tất cả các cột, bạn phải có danh sách cột cho biết bạn đang cung cấp giá trị cột nào.
INSERT INTO Sales.Promotion (PromotionName, ProductModelID, Discount)
VALUES
('Caps Locked', 2, 0.2);
Ngoài việc chèn một hàng đơn tại một thời điểm, câu lệnh INSERT VALUES có thể được sử dụng để chèn nhiều hàng bằng cách cung cấp nhiều tập giá trị được phân tách bằng dấu phẩy. Các tập giá trị cũng được phân tách bởi dấu phẩy, như thế này:
(col1_val,col2_val,col3_val),
(col1_val,col2_val,col3_val)
Danh sách giá trị này được gọi là trình tạo giá trị bảng. Đây là ví dụ về việc chèn thêm hai hàng vào bảng của chúng tôi với một hàm tạo giá trị bảng:
INSERT INTO Sales.Promotion
VALUES
('The gloves are off!', DEFAULT, 3, 0.25, NULL),
('The gloves are off!', DEFAULT, 4, 0.25, NULL);
CHÈN... LỰA
Ngoài việc chỉ định một tập hợp giá trị theo nghĩa đen trong câu lệnh INSERT, T-SQL cũng hỗ trợ sử dụng kết quả của các thao tác khác để cung cấp giá trị cho INSERT. Bạn có thể sử dụng kết quả của câu lệnh SELECT hoặc đầu ra của thủ tục được lưu trữ để cung cấp giá trị cho câu lệnh INSERT.
Để sử dụng INSERT với select được lồng, hãy xây dựng câu lệnh SELECT để thay thế mệnh đề VALUES. Với biểu mẫu này, được gọi là INSERT SELECT, bạn có thể chèn tập hợp các hàng mà truy vấn SELECT trả về vào bảng đích. Việc sử dụng INSERT SELECT thể hiện những điều cần cân nhắc tương tự như chèn giá trị:
- Bạn có thể tùy ý chỉ định một danh sách cột sau tên bảng.
- Bạn phải cung cấp giá trị cột hoặc DEFAULT, hay NULL cho mỗi cột.
Cú pháp sau đây minh họa cách sử dụng INSERT SELECT:
INSERT [INTO] <table or view> [(column_list)]
SELECT <column_list> FROM <table_list>...;
Ghi
Tập kết quả từ các thủ tục lưu trữ (hoặc thậm chí các lô động) cũng có thể được sử dụng làm dữ liệu vào câu lệnh INSERT. Hình thức insert, được gọi là INSERT EXEC, về khái niệm tương tự như INSERT SELECT và sẽ trình bày những cân nhắc tương tự. Tuy nhiên, thủ tục lưu trữ có thể trả về nhiều bộ kết quả, vì vậy cần phải chăm sóc thêm.
Ví dụ sau đây chèn nhiều hàng cho khuyến mãi mới có tên là Nhận Khung bằng cách truy xuất ID mô hình và tên mô hình từ bảng Production.ProductModel, cho mọi mô hình có chứa "khung" trong tên của nó.
INSERT INTO Sales.Promotion (PromotionName, ProductModelID, Discount, Notes)
SELECT DISTINCT 'Get Framed', m.ProductModelID, 0.1, '10% off ' + m.Name
FROM Production.ProductModel AS m
WHERE m.Name LIKE '%frame%';
Không giống như truy vấn con, SELECT lồng được sử dụng với INSERT không được đặt trong dấu ngoặc đơn.
LỰA... VÀO
Một tùy chọn khác để chèn hàng, tương tự như INSERT SELECT, là câu lệnh SELECT INTO. Sự khác biệt lớn nhất giữa INSERT SELECT và SELECT INTO là không thể sử dụng SELECT INTO để chèn hàng vào bảng hiện có, vì thao tác này luôn tạo bảng mới dựa trên kết quả của SELECT. Mỗi cột trong bảng mới sẽ có cùng tên, kiểu dữ liệu và nullability như cột (hoặc biểu thức) tương ứng trong danh sách SELECT.
Để sử dụng SELECT INTO, hãy new_table_name< INTO >vào mệnh đề SELECT của truy vấn, ngay trước mệnh đề FROM. Đây là ví dụ trích dữ liệu từ bảng Sales.SalesOrderHeader vào bảng mới có tên Sales.Invoice..
SELECT SalesOrderID, CustomerID, OrderDate, PurchaseOrderNumber, TotalDue
INTO Sales.Invoice
FROM Sales.SalesOrderHeader;
SELECT INTO sẽ không thành công nếu đã có một bảng có tên được xác định sau INTO. Sau khi tạo bảng, bảng có thể được xử lý như bất kỳ bảng nào khác. Bạn có thể chọn từ đó, nối nó với các bảng khác hoặc chèn thêm hàng vào đó.