I SQL Server, VALUES
är en tabellvärdekonstruktor som specificerar en uppsättning radvärdeuttryck som ska konstrueras till en tabell.
VALUES
sats används ofta med INSERT
satser för att infoga data, men det kan också användas som en härledd tabell i antingen USING
satsen i MERGE
eller FROM
klausul.
Syntax
VALUES ( <row value expression list> ) [ ,...n ]
<row value expression list> ::=
{<row value expression> } [ ,...n ]
<row value expression> ::=
{ DEFAULT | NULL | expression }
Observera att DEFAULT
tillåts endast i en INSERT
påstående. DEFAULT
tvingar SQL Server att infoga standardvärdet som definierats för kolumnen. Om en standard inte finns för kolumnen och kolumnen tillåter null-värden, NULL
förs in. DEFAULT
kan inte användas på identitetskolumner.
Exempel
Här är några exempel som visar hur VALUES
kan användas i SQL Server.
Används i en INSERT
Uttalande
Här är ett exempel på hur du använder VALUES
sats som en del av en INSERT
uttalande:
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');
Det skapade en tabell som heter Idiots
och infogade tre rader i den.
Vi kan nu använda en SELECT
uttalande för att se de nya värdena i tabellen:
SELECT * FROM Idiots;
Resultat:
+-----------+-------------+------------+ | IdiotId | FirstName | LastName | |-----------+-------------+------------| | 1 | Peter | Griffin | | 2 | Homer | Simpson | | 3 | Ned | Flanders | +-----------+-------------+------------+
När VALUES
sats används i en INSERT
uttalande, det finns en gräns på 1000 rader. Ett sätt att övervinna detta är att använda VALUES
i en SELECT
uttalande för att skapa en härledd tabell. Det räddar oss från att behöva använda flera INSERT
uttalanden eller göra en massinsättning.
Används i en SELECT
Uttalande
Vi kan använda VALUES
för att skapa en härledd tabell i FROM
klausul. Här är en SELECT
uttalande för att visa:
SELECT
FirstName,
LastName
FROM
(VALUES
(1, 'Peter', 'Griffin'),
(2, 'Homer', 'Simpson'),
(3, 'Ned', 'Flanders')
) AS Idiots(IdiotId, FirstName, LastName)
WHERE IdiotId = 2;
Resultat:
+-------------+------------+ | FirstName | LastName | |-------------+------------| | Homer | Simpson | +-------------+------------+
Härledda tabeller kan användas för att övervinna gränsen på 1000 rader när värden infogas i en databas.
Används i en MERGE
Uttalande
Här är ett exempel på VALUES
används i en MERGE
uttalande:
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;
Resultat:
+----------+---------+ | Change | Count | |----------+---------| | INSERT | 2 | | UPDATE | 1 | +----------+---------+
I det här fallet uppdaterades en rad och två nya rader infogades, baserat på värdena i VALUES
klausul.
Här är den resulterande tabellen nu:
SELECT * FROM Idiots;
Resultat:
+-----------+-------------+---------------+ | IdiotId | FirstName | LastName | |-----------+-------------+---------------| | 1 | Peter | Griffin | | 2 | Homer | Simpson | | 3 | Ned | Okily Dokily! | | 4 | Lloyd | Christmas | | 5 | Harry | Dunne | +-----------+-------------+---------------+