Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Clause VALUES dans SQL Server

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