Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Cláusula VALUES no SQL Server


No SQL Server, VALUES é um construtor de valor de tabela que especifica um conjunto de expressões de valor de linha a serem construídas em uma tabela.

Os VALUES cláusula é frequentemente usada com INSERT instruções para inserir dados, mas também pode ser usado como uma tabela derivada no USING cláusula do MERGE instrução ou o FROM cláusula.

Sintaxe

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

Observe que DEFAULT é permitido apenas em um INSERT demonstração. DEFAULT força o SQL Server a inserir o valor padrão definido para a coluna. Se um padrão não existir para a coluna e a coluna permitir valores nulos, NULL está inserido. DEFAULT não pode ser usado em colunas de identidade.

Exemplos


Aqui estão alguns exemplos que demonstram como VALUES pode ser usado no SQL Server.

Usado em um INSERT Declaração


Aqui está um exemplo de uso de VALUES cláusula como parte de um INSERT demonstração:
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');

Isso criou uma tabela chamada Idiots e inseriu três linhas nele.

Agora podemos usar um SELECT instrução para ver os novos valores na tabela:
SELECT * FROM Idiots;

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

Quando os VALUES cláusula é usada em um INSERT instrução, há um limite de 1.000 linhas. Uma maneira de superar isso é usar VALUES em um SELECT instrução para criar uma tabela derivada. Isso evita que tenhamos que usar vários INSERT instruções ou fazendo uma inserção em massa.

Usado em um SELECT Declaração


Podemos usar VALUES para criar uma tabela derivada no FROM cláusula. Aqui está um SELECT declaração para demonstrar:
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    |
+-------------+------------+

As tabelas derivadas podem ser usadas para superar o limite de 1.000 linhas ao inserir valores em um banco de dados.

Usado em um MERGE Declaração


Aqui está um exemplo de VALUES sendo usado em um MERGE demonstração:
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       |
+----------+---------+

Nesse caso, uma linha foi atualizada e duas novas linhas foram inseridas, com base nos valores fornecidos no VALUES cláusula.

Aqui está a tabela resultante agora:
SELECT * FROM Idiots;

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