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 | +-----------+-------------+---------------+