W SQL Server, VALUES
jest konstruktorem wartości tabeli, który określa zestaw wyrażeń wartości wiersza, które mają być skonstruowane w tabeli.
VALUES
klauzula jest często używana z INSERT
instrukcji do wstawiania danych, ale może być również używana jako tabela pochodna w USING
klauzula MERGE
oświadczenie lub FROM
klauzula.
Składnia
VALUES ( <row value expression list> ) [ ,...n ]
<row value expression list> ::=
{<row value expression> } [ ,...n ]
<row value expression> ::=
{ DEFAULT | NULL | expression }
Zwróć uwagę, że DEFAULT
jest dozwolone tylko w INSERT
oświadczenie. DEFAULT
zmusza SQL Server do wstawienia wartości domyślnej zdefiniowanej dla kolumny. Jeśli wartość domyślna nie istnieje dla kolumny, a kolumna zezwala na wartości null, NULL
jest wstawiony. DEFAULT
nie może być używany w kolumnach tożsamości.
Przykłady
Oto kilka przykładów pokazujących, jak VALUES
może być używany w SQL Server.
Używane w INSERT
Oświadczenie
Oto przykład użycia VALUES
klauzula jako część INSERT
oświadczenie:
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 stworzyło tabelę o nazwie Idiots
i wstawił do niego trzy rzędy.
Możemy teraz użyć SELECT
oświadczenie, aby zobaczyć nowe wartości w tabeli:
SELECT * FROM Idiots;
Wynik:
+-----------+-------------+------------+ | IdiotId | FirstName | LastName | |-----------+-------------+------------| | 1 | Peter | Griffin | | 2 | Homer | Simpson | | 3 | Ned | Flanders | +-----------+-------------+------------+
Gdy VALUES
klauzula jest używana w INSERT
oświadczenie, istnieje limit 1000 wierszy. Jednym ze sposobów rozwiązania tego problemu jest użycie VALUES
w SELECT
instrukcja, aby utworzyć tabelę pochodną. To oszczędza nam konieczności używania wielu INSERT
oświadczenia lub robienie wstawek zbiorczych.
Używane w SELECT
Oświadczenie
Możemy użyć VALUES
aby utworzyć tabelę pochodną w FROM
klauzula. Oto SELECT
oświadczenie do zademonstrowania:
SELECT
FirstName,
LastName
FROM
(VALUES
(1, 'Peter', 'Griffin'),
(2, 'Homer', 'Simpson'),
(3, 'Ned', 'Flanders')
) AS Idiots(IdiotId, FirstName, LastName)
WHERE IdiotId = 2;
Wynik:
+-------------+------------+ | FirstName | LastName | |-------------+------------| | Homer | Simpson | +-------------+------------+
Tabele pochodne można wykorzystać do przekroczenia limitu 1000 wierszy podczas wstawiania wartości do bazy danych.
Używane w MERGE
Oświadczenie
Oto przykład VALUES
używane w MERGE
oświadczenie:
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;
Wynik:
+----------+---------+ | Change | Count | |----------+---------| | INSERT | 2 | | UPDATE | 1 | +----------+---------+
W tym przypadku zaktualizowano jeden wiersz i wstawiono dwa nowe wiersze na podstawie wartości podanych w VALUES
klauzula.
Oto wynikowa tabela teraz:
SELECT * FROM Idiots;
Wynik:
+-----------+-------------+---------------+ | IdiotId | FirstName | LastName | |-----------+-------------+---------------| | 1 | Peter | Griffin | | 2 | Homer | Simpson | | 3 | Ned | Okily Dokily! | | 4 | Lloyd | Christmas | | 5 | Harry | Dunne | +-----------+-------------+---------------+