In SQL Server, VALUES è un costruttore di valori di tabella che specifica un insieme di espressioni di valori di riga da costruire in una tabella.
I VALUES La clausola è spesso usata con INSERT istruzioni per inserire dati, ma può anche essere usata come tabella derivata in USING clausola del MERGE istruzione o il FROM clausola.
Sintassi
VALUES ( <row value expression list> ) [ ,...n ]
<row value expression list> ::=
{<row value expression> } [ ,...n ]
<row value expression> ::=
{ DEFAULT | NULL | expression }
Nota che DEFAULT è consentito solo in un INSERT dichiarazione. DEFAULT forza SQL Server a inserire il valore predefinito definito per la colonna. Se non esiste un valore predefinito per la colonna e la colonna consente valori null, NULL è inserito. DEFAULT non può essere utilizzato nelle colonne identità.
Esempi
Ecco alcuni esempi che dimostrano come VALUES può essere utilizzato in SQL Server.
Utilizzato in un INSERT Dichiarazione
Ecco un esempio di utilizzo di VALUES clausola come parte di un INSERT dichiarazione:
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');
Ciò ha creato una tabella chiamata Idiots e inserito tre righe al suo interno.
Ora possiamo usare un SELECT istruzione per vedere i nuovi valori nella tabella:
SELECT * FROM Idiots; Risultato:
+-----------+-------------+------------+ | IdiotId | FirstName | LastName | |-----------+-------------+------------| | 1 | Peter | Griffin | | 2 | Homer | Simpson | | 3 | Ned | Flanders | +-----------+-------------+------------+
Quando il VALUES La clausola viene utilizzata in un INSERT istruzione, esiste un limite di 1000 righe. Un modo per superare questo problema è utilizzare VALUES in un SELECT istruzione per creare una tabella derivata. Questo ci evita di dover utilizzare più INSERT dichiarazioni o eseguendo un inserimento collettivo.
Utilizzato in un SELECT Dichiarazione
Possiamo usare VALUES per creare una tabella derivata nel FROM clausola. Ecco un SELECT dichiarazione da dimostrare:
SELECT
FirstName,
LastName
FROM
(VALUES
(1, 'Peter', 'Griffin'),
(2, 'Homer', 'Simpson'),
(3, 'Ned', 'Flanders')
) AS Idiots(IdiotId, FirstName, LastName)
WHERE IdiotId = 2; Risultato:
+-------------+------------+ | FirstName | LastName | |-------------+------------| | Homer | Simpson | +-------------+------------+
Le tabelle derivate possono essere utilizzate per superare il limite di 1000 righe durante l'inserimento di valori in un database.
Utilizzato in un MERGE Dichiarazione
Ecco un esempio di VALUES utilizzato in un MERGE dichiarazione:
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; Risultato:
+----------+---------+ | Change | Count | |----------+---------| | INSERT | 2 | | UPDATE | 1 | +----------+---------+
In questo caso è stata aggiornata una riga e sono state inserite due nuove righe, in base ai valori forniti nel VALUES clausola.
Ecco la tabella risultante ora:
SELECT * FROM Idiots; Risultato:
+-----------+-------------+---------------+ | IdiotId | FirstName | LastName | |-----------+-------------+---------------| | 1 | Peter | Griffin | | 2 | Homer | Simpson | | 3 | Ned | Okily Dokily! | | 4 | Lloyd | Christmas | | 5 | Harry | Dunne | +-----------+-------------+---------------+