V SQL Server VALUES
je konstruktor hodnot tabulky, který specifikuje sadu výrazů hodnoty řádku, které mají být zkonstruovány do tabulky.
VALUES
klauzule se často používá s INSERT
příkazy pro vkládání dat, ale lze je také použít jako odvozenou tabulku buď v USING
klauzule MERGE
nebo FROM
doložka.
Syntaxe
VALUES ( <row value expression list> ) [ ,...n ]
<row value expression list> ::=
{<row value expression> } [ ,...n ]
<row value expression> ::=
{ DEFAULT | NULL | expression }
Všimněte si, že DEFAULT
je povoleno pouze v INSERT
prohlášení. DEFAULT
přinutí SQL Server vložit výchozí hodnotu definovanou pro sloupec. Pokud pro sloupec neexistuje výchozí nastavení a sloupec umožňuje hodnoty null, NULL
je vložen. DEFAULT
nelze použít ve sloupcích identity.
Příklady
Zde je několik příkladů, které demonstrují, jak VALUES
lze použít v SQL Server.
Použito v INSERT
Prohlášení
Zde je příklad použití VALUES
klauzule jako součást INSERT
prohlášení:
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');
To vytvořilo tabulku s názvem Idiots
a vložili do něj tři řádky.
Nyní můžeme použít SELECT
příkaz k zobrazení nových hodnot v tabulce:
SELECT * FROM Idiots;
Výsledek:
+-----------+-------------+------------+ | IdiotId | FirstName | LastName | |-----------+-------------+------------| | 1 | Peter | Griffin | | 2 | Homer | Simpson | | 3 | Ned | Flanders | +-----------+-------------+------------+
Když VALUES
klauzule se používá v INSERT
je limit 1000 řádků. Jedním ze způsobů, jak to překonat, je použít VALUES
v SELECT
příkaz k vytvoření odvozené tabulky. To nás ušetří od nutnosti používat více INSERT
nebo hromadné vkládání.
Použito v SELECT
Prohlášení
Můžeme použít VALUES
k vytvoření odvozené tabulky v FROM
doložka. Zde je SELECT
prohlášení k prokázání:
SELECT
FirstName,
LastName
FROM
(VALUES
(1, 'Peter', 'Griffin'),
(2, 'Homer', 'Simpson'),
(3, 'Ned', 'Flanders')
) AS Idiots(IdiotId, FirstName, LastName)
WHERE IdiotId = 2;
Výsledek:
+-------------+------------+ | FirstName | LastName | |-------------+------------| | Homer | Simpson | +-------------+------------+
Odvozené tabulky lze použít k překonání limitu 1000 řádků při vkládání hodnot do databáze.
Použito v MERGE
Prohlášení
Zde je příklad VALUES
se používá v MERGE
prohlášení:
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;
Výsledek:
+----------+---------+ | Change | Count | |----------+---------| | INSERT | 2 | | UPDATE | 1 | +----------+---------+
V tomto případě byl aktualizován jeden řádek a vloženy dva nové řádky na základě hodnot uvedených v VALUES
doložka.
Zde je výsledná tabulka:
SELECT * FROM Idiots;
Výsledek:
+-----------+-------------+---------------+ | IdiotId | FirstName | LastName | |-----------+-------------+---------------| | 1 | Peter | Griffin | | 2 | Homer | Simpson | | 3 | Ned | Okily Dokily! | | 4 | Lloyd | Christmas | | 5 | Harry | Dunne | +-----------+-------------+---------------+