В SQL Server, VALUES
е конструктор на стойност на таблицата, който определя набор от изрази за стойности на редове, които да бъдат конструирани в таблица.
VALUES
клаузата често се използва с INSERT
изрази за вмъкване на данни, но може да се използва и като производна таблица в USING
клауза на MERGE
оператор или FROM
клауза.
Синтаксис
VALUES ( <row value expression list> ) [ ,...n ]
<row value expression list> ::=
{<row value expression> } [ ,...n ]
<row value expression> ::=
{ DEFAULT | NULL | expression }
Обърнете внимание, че DEFAULT
е разрешено само в INSERT
изявление. DEFAULT
принуждава SQL Server да вмъкне стойността по подразбиране, дефинирана за колоната. Ако за колоната не съществува по подразбиране и колоната позволява нулеви стойности, NULL
се вмъква. DEFAULT
не може да се използва за колони за идентичност.
Примери
Ето няколко примера, които демонстрират как VALUES
може да се използва в SQL Server.
Използва се в INSERT
Изявление
Ето пример за използване на VALUES
клауза като част от INSERT
изявление:
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');
Това създаде таблица, наречена Idiots
и вмъкнах три реда в него.
Вече можем да използваме SELECT
оператор, за да видите новите стойности в таблицата:
SELECT * FROM Idiots;
Резултат:
+-----------+-------------+------------+ | IdiotId | FirstName | LastName | |-----------+-------------+------------| | 1 | Peter | Griffin | | 2 | Homer | Simpson | | 3 | Ned | Flanders | +-----------+-------------+------------+
Когато VALUES
клаузата се използва в INSERT
изявление, има ограничение от 1000 реда. Един от начините да преодолеете това е да използвате VALUES
в SELECT
оператор за създаване на производна таблица. Това ни спестява от необходимостта да използваме множество INSERT
изявления или извършване на групово вмъкване.
Използва се в SELECT
Изявление
Можем да използваме VALUES
за да създадете производна таблица в FROM
клауза. Ето SELECT
изявление за демонстриране:
SELECT
FirstName,
LastName
FROM
(VALUES
(1, 'Peter', 'Griffin'),
(2, 'Homer', 'Simpson'),
(3, 'Ned', 'Flanders')
) AS Idiots(IdiotId, FirstName, LastName)
WHERE IdiotId = 2;
Резултат:
+-------------+------------+ | FirstName | LastName | |-------------+------------| | Homer | Simpson | +-------------+------------+
Извлечените таблици могат да се използват за преодоляване на ограничението от 1000 реда при вмъкване на стойности в база данни.
Използва се в MERGE
Изявление
Ето пример за VALUES
се използва в MERGE
изявление:
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;
Резултат:
+----------+---------+ | Change | Count | |----------+---------| | INSERT | 2 | | UPDATE | 1 | +----------+---------+
В този случай един ред беше актуализиран и бяха вмъкнати два нови реда въз основа на стойностите, предоставени в VALUES
клауза.
Ето резултатната таблица сега:
SELECT * FROM Idiots;
Резултат:
+-----------+-------------+---------------+ | IdiotId | FirstName | LastName | |-----------+-------------+---------------| | 1 | Peter | Griffin | | 2 | Homer | Simpson | | 3 | Ned | Okily Dokily! | | 4 | Lloyd | Christmas | | 5 | Harry | Dunne | +-----------+-------------+---------------+