I SQL Server, VALUES
er en tabelværdikonstruktør, der specificerer et sæt rækkeværdiudtryk, der skal konstrueres til en tabel.
VALUES
klausul bruges ofte sammen med INSERT
sætninger til at indsætte data, men det kan også bruges som en afledt tabel i enten USING
klausul i MERGE
sætning eller FROM
klausul.
Syntaks
VALUES ( <row value expression list> ) [ ,...n ]
<row value expression list> ::=
{<row value expression> } [ ,...n ]
<row value expression> ::=
{ DEFAULT | NULL | expression }
Bemærk, at DEFAULT
er kun tilladt i en INSERT
udmelding. DEFAULT
tvinger SQL Server til at indsætte standardværdien defineret for kolonnen. Hvis der ikke findes en standard for kolonnen, og kolonnen tillader null-værdier, NULL
er indsat. DEFAULT
kan ikke bruges på identitetskolonner.
Eksempler
Her er nogle eksempler, der viser, hvordan VALUES
kan bruges i SQL Server.
Bruges i en INSERT
Erklæring
Her er et eksempel på brug af VALUES
klausul som en del af en INSERT
erklæring:
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 skabte en tabel kaldet Idiots
og indsatte tre rækker i den.
Vi kan nu bruge en SELECT
sætning for at se de nye værdier i tabellen:
SELECT * FROM Idiots;
Resultat:
+-------+-------------+------------+| IdiotId | Fornavn | Efternavn ||-----------+-------------+-----------|| 1 | Peter | Griffin || 2 | Homer | Simpson || 3 | Ned | Flandern |+-----------+-------------+------------+
Når VALUES
klausul bruges i en INSERT
sætning, er der en grænse på 1000 rækker. En måde at overvinde dette på er at bruge VALUES
i en SELECT
sætning for at oprette en afledt tabel. Det sparer os for at skulle bruge flere INSERT
udsagn eller lave en masseindsættelse.
Bruges i en SELECT
Erklæring
Vi kan bruge VALUES
at oprette en afledt tabel i FROM
klausul. Her er en SELECT
erklæring for at demonstrere:
SELECT
FirstName,
LastName
FROM
(VALUES
(1, 'Peter', 'Griffin'),
(2, 'Homer', 'Simpson'),
(3, 'Ned', 'Flanders')
) AS Idiots(IdiotId, FirstName, LastName)
WHERE IdiotId = 2;
Resultat:
+-------------+------------+| Fornavn | Efternavn ||-------------+------------|| Homer | Simpson |+-------------+------------+
Afledte tabeller kan bruges til at overvinde grænsen på 1000 rækker, når du indsætter værdier i en database.
Bruges i en MERGE
Erklæring
Her er et eksempel på VALUES
bliver brugt i en MERGE
erklæring:
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:
+----------+---------+| Skift | Tæl ||---------+---------|| INDSÆT | 2 || OPDATERING | 1 |+----------+---------+
I dette tilfælde blev en række opdateret, og to nye rækker blev indsat, baseret på værdierne angivet i VALUES
klausul.
Her er den resulterende tabel nu:
SELECT * FROM Idiots;
Resultat:
+-------+-------------------+| IdiotId | Fornavn | Efternavn ||-----------+-------------+--------------------|| 1 | Peter | Griffin || 2 | Homer | Simpson || 3 | Ned | Oki Dokily! || 4 | Lloyd | jul || 5 | Harry | Dunne |+-----------+-------------+---------+