sql >> Base de Datos >  >> RDS >> Sqlserver

Cláusula VALUES en SQL Server

En SQL Server, VALUES es un constructor de valores de tabla que especifica un conjunto de expresiones de valores de fila que se construirán en una tabla.

Los VALUES La cláusula se usa a menudo con INSERT sentencias para insertar datos, pero también se puede usar como una tabla derivada en el USING cláusula del MERGE declaración o el FROM cláusula.

Sintaxis

VALUES ( <row value expression list> ) [ ,...n ]   
  
<row value expression list> ::=  
    {<row value expression> } [ ,...n ]  
  
<row value expression> ::=  
    { DEFAULT | NULL | expression }

Tenga en cuenta que DEFAULT solo se permite en un INSERT declaración. DEFAULT obliga a SQL Server a insertar el valor predeterminado definido para la columna. Si no existe un valor predeterminado para la columna y la columna permite valores nulos, NULL se inserta. DEFAULT no se puede usar en columnas de identidad.

Ejemplos

Estos son algunos ejemplos que demuestran cómo VALUES se puede utilizar en SQL Server.

Usado en un INSERT Declaración

Aquí hay un ejemplo del uso de VALUES cláusula como parte de un INSERT declaración:

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');

Eso creó una tabla llamada Idiots e insertó tres filas en él.

Ahora podemos usar un SELECT instrucción para ver los nuevos valores en la tabla:

SELECT * FROM Idiots;

Resultado:

+-----------+-------------+------------+
| IdiotId   | FirstName   | LastName   |
|-----------+-------------+------------|
| 1         | Peter       | Griffin    |
| 2         | Homer       | Simpson    |
| 3         | Ned         | Flanders   |
+-----------+-------------+------------+

Cuando los VALUES cláusula se utiliza en un INSERT declaración, hay un límite de 1000 filas. Una forma de superar esto es usar VALUES en un SELECT instrucción para crear una tabla derivada. Eso nos evita tener que usar múltiples INSERT declaraciones o haciendo una inserción masiva.

Usado en un SELECT Declaración

Podemos usar VALUES para crear una tabla derivada en el FROM cláusula. Aquí hay un SELECT declaración para demostrar:

SELECT
   FirstName,
   LastName
FROM
   (VALUES 
        (1, 'Peter', 'Griffin'),
        (2, 'Homer', 'Simpson'),
        (3, 'Ned', 'Flanders')
   ) AS Idiots(IdiotId, FirstName, LastName)
WHERE IdiotId = 2;

Resultado:

+-------------+------------+
| FirstName   | LastName   |
|-------------+------------|
| Homer       | Simpson    |
+-------------+------------+

Las tablas derivadas se pueden usar para superar el límite de 1000 filas al insertar valores en una base de datos.

Usado en un MERGE Declaración

Aquí hay un ejemplo de VALUES siendo usado en un MERGE declaración:

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;

Resultado:

+----------+---------+
| Change   | Count   |
|----------+---------|
| INSERT   | 2       |
| UPDATE   | 1       |
+----------+---------+

En este caso, se actualizó una fila y se insertaron dos filas nuevas, según los valores proporcionados en VALUES cláusula.

Aquí está la tabla resultante ahora:

SELECT * FROM Idiots;

Resultado:

+-----------+-------------+---------------+
| IdiotId   | FirstName   | LastName      |
|-----------+-------------+---------------|
| 1         | Peter       | Griffin       |
| 2         | Homer       | Simpson       |
| 3         | Ned         | Okily Dokily! |
| 4         | Lloyd       | Christmas     |
| 5         | Harry       | Dunne         |
+-----------+-------------+---------------+