In SQL Server, VALUES
is een tabelwaardeconstructor die een reeks rijwaarde-expressies specificeert die in een tabel moeten worden geconstrueerd.
De VALUES
clausule wordt vaak gebruikt met INSERT
instructies om gegevens in te voegen, maar het kan ook worden gebruikt als een afgeleide tabel in de USING
clausule van de MERGE
statement of de FROM
clausule.
Syntaxis
VALUES ( <row value expression list> ) [ ,...n ]
<row value expression list> ::=
{<row value expression> } [ ,...n ]
<row value expression> ::=
{ DEFAULT | NULL | expression }
Merk op dat DEFAULT
is alleen toegestaan in een INSERT
uitspraak. DEFAULT
dwingt SQL Server om de standaardwaarde in te voegen die voor de kolom is gedefinieerd. Als er geen standaard voor de kolom bestaat en de kolom staat null-waarden toe, NULL
wordt ingevoegd. DEFAULT
kan niet worden gebruikt op identiteitskolommen.
Voorbeelden
Hier zijn enkele voorbeelden die laten zien hoe VALUES
kan worden gebruikt in SQL Server.
Gebruikt in een INSERT
Verklaring
Hier is een voorbeeld van het gebruik van de VALUES
clausule als onderdeel van een INSERT
verklaring:
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');
Dat creëerde een tabel met de naam Idiots
en voegde er drie rijen in.
We kunnen nu een SELECT
. gebruiken statement om de nieuwe waarden in de tabel te zien:
SELECT * FROM Idiots;
Resultaat:
+-----------+-------------+------------+ | IdiotId | FirstName | LastName | |-----------+-------------+------------| | 1 | Peter | Griffin | | 2 | Homer | Simpson | | 3 | Ned | Flanders | +-----------+-------------+------------+
Wanneer de VALUES
clausule wordt gebruikt in een INSERT
statement, is er een limiet van 1000 rijen. Een manier om dit te verhelpen is door VALUES
. te gebruiken in een SELECT
statement om een afgeleide tabel te maken. Dat bespaart ons het gebruik van meerdere INSERT
verklaringen of het doen van een bulkinvoeging.
Gebruikt in een SELECT
Verklaring
We kunnen VALUES
. gebruiken om een afgeleide tabel te maken in de FROM
clausule. Hier is een SELECT
verklaring om aan te tonen:
SELECT
FirstName,
LastName
FROM
(VALUES
(1, 'Peter', 'Griffin'),
(2, 'Homer', 'Simpson'),
(3, 'Ned', 'Flanders')
) AS Idiots(IdiotId, FirstName, LastName)
WHERE IdiotId = 2;
Resultaat:
+-------------+------------+ | FirstName | LastName | |-------------+------------| | Homer | Simpson | +-------------+------------+
Afgeleide tabellen kunnen worden gebruikt om de limiet van 1000 rijen te overschrijden bij het invoegen van waarden in een database.
Gebruikt in een MERGE
Verklaring
Hier is een voorbeeld van VALUES
wordt gebruikt in een MERGE
verklaring:
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;
Resultaat:
+----------+---------+ | Change | Count | |----------+---------| | INSERT | 2 | | UPDATE | 1 | +----------+---------+
In dit geval is één rij bijgewerkt en zijn er twee nieuwe rijen ingevoegd, gebaseerd op de waarden in de VALUES
clausule.
Dit is nu de resulterende tabel:
SELECT * FROM Idiots;
Resultaat:
+-----------+-------------+---------------+ | IdiotId | FirstName | LastName | |-----------+-------------+---------------| | 1 | Peter | Griffin | | 2 | Homer | Simpson | | 3 | Ned | Okily Dokily! | | 4 | Lloyd | Christmas | | 5 | Harry | Dunne | +-----------+-------------+---------------+