Trong SQL Server, VALUES
là một phương thức tạo giá trị bảng chỉ định một tập hợp các biểu thức giá trị hàng được xây dựng thành một bảng.
VALUES
mệnh đề thường được sử dụng với INSERT
để chèn dữ liệu, nhưng nó cũng có thể được sử dụng như một bảng dẫn xuất trong USING
mệnh đề của MERGE
hoặc câu lệnh FROM
mệnh đề.
Cú pháp
VALUES ( <row value expression list> ) [ ,...n ]
<row value expression list> ::=
{<row value expression> } [ ,...n ]
<row value expression> ::=
{ DEFAULT | NULL | expression }
Lưu ý rằng DEFAULT
chỉ được phép trong INSERT
tuyên bố. DEFAULT
buộc SQL Server phải chèn giá trị mặc định được xác định cho cột. Nếu không tồn tại mặc định cho cột và cột cho phép giá trị rỗng, NULL
được chèn vào. DEFAULT
không thể được sử dụng trên các cột nhận dạng.
Ví dụ
Dưới đây là một số ví dụ chứng minh cách VALUES
có thể được sử dụng trong SQL Server.
Được sử dụng trong INSERT
Tuyên bố
Dưới đây là một ví dụ về việc sử dụng VALUES
mệnh đề như một phần của INSERT
tuyên bố:
CREATE TABLE Idiots (
IdiotId int IDENTITY(1,1) NOT NULL,
FirstName varchar(50),
LastName varchar(50)
);
INSERT INTO Idiots VALUES
('Peter', 'Griffin'),
('Homer', 'Simpson'),
('Ned', 'Flanders');
Điều đó đã tạo ra một bảng có tên là Idiots
và chèn ba hàng vào đó.
Bây giờ chúng ta có thể sử dụng SELECT
để xem các giá trị mới trong bảng:
SELECT * FROM Idiots;
Kết quả:
+-----------+-------------+------------+ | IdiotId | FirstName | LastName | |-----------+-------------+------------| | 1 | Peter | Griffin | | 2 | Homer | Simpson | | 3 | Ned | Flanders | +-----------+-------------+------------+
Khi VALUES
mệnh đề được sử dụng trong INSERT
, có giới hạn 1000 hàng. Một cách để khắc phục điều này là sử dụng VALUES
trong một SELECT
câu lệnh để tạo một bảng dẫn xuất. Điều đó giúp chúng tôi không phải sử dụng nhiều INSERT
hoặc thực hiện chèn hàng loạt.
Được sử dụng trong SELECT
Tuyên bố
Chúng ta có thể sử dụng VALUES
để tạo một bảng dẫn xuất trong FROM
mệnh đề. Đây là SELECT
tuyên bố để chứng minh:
SELECT
FirstName,
LastName
FROM
(VALUES
(1, 'Peter', 'Griffin'),
(2, 'Homer', 'Simpson'),
(3, 'Ned', 'Flanders')
) AS Idiots(IdiotId, FirstName, LastName)
WHERE IdiotId = 2;
Kết quả:
+-------------+------------+ | FirstName | LastName | |-------------+------------| | Homer | Simpson | +-------------+------------+
Bảng gốc có thể được sử dụng để vượt qua giới hạn 1000 hàng khi chèn giá trị vào cơ sở dữ liệu.
Được sử dụng trong MERGE
Tuyên bố
Đây là một ví dụ về VALUES
được sử dụng trong MERGE
tuyên bố:
DECLARE @Changes TABLE(Change VARCHAR(20));
MERGE INTO Idiots AS Target
USING ( VALUES
(3, 'Ned', 'Okily Dokily!'),
(4, 'Lloyd','Christmas'),
(5, 'Harry', 'Dunne')
) AS Source ( IdiotId, FirstName, LastName )
ON Target.IdiotId = Source.IdiotId
AND Target.FirstName = Source.FirstName
WHEN MATCHED THEN
UPDATE SET FirstName = Source.FirstName, LastName = Source.LastName
WHEN NOT MATCHED BY TARGET THEN
INSERT (FirstName, LastName) VALUES (Source.FirstName, Source.LastName)
OUTPUT $action INTO @Changes;
SELECT Change, COUNT(*) AS Count
FROM @Changes
GROUP BY Change;
Kết quả:
+----------+---------+ | Change | Count | |----------+---------| | INSERT | 2 | | UPDATE | 1 | +----------+---------+
Trong trường hợp này, một hàng đã được cập nhật và hai hàng mới được chèn vào, dựa trên các giá trị được cung cấp trong VALUES
mệnh đề.
Đây là bảng kết quả bây giờ:
SELECT * FROM Idiots;
Kết quả:
+-----------+-------------+---------------+ | IdiotId | FirstName | LastName | |-----------+-------------+---------------| | 1 | Peter | Griffin | | 2 | Homer | Simpson | | 3 | Ned | Okily Dokily! | | 4 | Lloyd | Christmas | | 5 | Harry | Dunne | +-----------+-------------+---------------+