Dans SQL Server, VALUES
est un constructeur de valeur de table qui spécifie un ensemble d'expressions de valeur de ligne à construire dans une table.
Les VALUES
la clause est souvent utilisée avec INSERT
instructions pour insérer des données, mais il peut également être utilisé comme table dérivée dans le USING
clause de la MERGE
déclaration ou le FROM
clause.
Syntaxe
VALUES ( <row value expression list> ) [ ,...n ]
<row value expression list> ::=
{<row value expression> } [ ,...n ]
<row value expression> ::=
{ DEFAULT | NULL | expression }
Notez que DEFAULT
n'est autorisé que dans un INSERT
déclaration. DEFAULT
force SQL Server à insérer la valeur par défaut définie pour la colonne. Si une valeur par défaut n'existe pas pour la colonne et que la colonne autorise les valeurs nulles, NULL
est inséré. DEFAULT
ne peut pas être utilisé sur les colonnes d'identité.
Exemples
Voici quelques exemples qui montrent comment VALUES
peut être utilisé dans SQL Server.
Utilisé dans un INSERT
Déclaration
Voici un exemple d'utilisation des VALUES
clause dans le cadre d'un INSERT
déclaration :
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');
Cela a créé une table appelée Idiots
et y ai inséré trois lignes.
Nous pouvons maintenant utiliser un SELECT
pour voir les nouvelles valeurs dans le tableau :
SELECT * FROM Idiots;
Résultat :
+-----------+-------------+------------+ | IdiotId | FirstName | LastName | |-----------+-------------+------------| | 1 | Peter | Griffin | | 2 | Homer | Simpson | | 3 | Ned | Flanders | +-----------+-------------+------------+
Lorsque les VALUES
la clause est utilisée dans un INSERT
instruction, il y a une limite de 1000 lignes. Une façon de surmonter cela consiste à utiliser VALUES
dans un SELECT
instruction pour créer une table dérivée. Cela nous évite d'avoir à utiliser plusieurs INSERT
déclarations ou faire une insertion en masse.
Utilisé dans un SELECT
Déclaration
Nous pouvons utiliser VALUES
pour créer une table dérivée dans le FROM
clause. Voici un SELECT
déclaration à démontrer :
SELECT
FirstName,
LastName
FROM
(VALUES
(1, 'Peter', 'Griffin'),
(2, 'Homer', 'Simpson'),
(3, 'Ned', 'Flanders')
) AS Idiots(IdiotId, FirstName, LastName)
WHERE IdiotId = 2;
Résultat :
+-------------+------------+ | FirstName | LastName | |-------------+------------| | Homer | Simpson | +-------------+------------+
Les tables dérivées peuvent être utilisées pour dépasser la limite de 1000 lignes lors de l'insertion de valeurs dans une base de données.
Utilisé dans un MERGE
Déclaration
Voici un exemple de VALUES
utilisé dans un MERGE
déclaration :
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;
Résultat :
+----------+---------+ | Change | Count | |----------+---------| | INSERT | 2 | | UPDATE | 1 | +----------+---------+
Dans ce cas, une ligne a été mise à jour et deux nouvelles lignes ont été insérées, en fonction des valeurs fournies dans les VALUES
clause.
Voici maintenant le tableau résultant :
SELECT * FROM Idiots;
Résultat :
+-----------+-------------+---------------+ | IdiotId | FirstName | LastName | |-----------+-------------+---------------| | 1 | Peter | Griffin | | 2 | Homer | Simpson | | 3 | Ned | Okily Dokily! | | 4 | Lloyd | Christmas | | 5 | Harry | Dunne | +-----------+-------------+---------------+