Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Klauzula VALUES w SQL Server

W SQL Server, VALUES jest konstruktorem wartości tabeli, który określa zestaw wyrażeń wartości wiersza, które mają być skonstruowane w tabeli.

VALUES klauzula jest często używana z INSERT instrukcji do wstawiania danych, ale może być również używana jako tabela pochodna w USING klauzula MERGE oświadczenie lub FROM klauzula.

Składnia

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

Zwróć uwagę, że DEFAULT jest dozwolone tylko w INSERT oświadczenie. DEFAULT zmusza SQL Server do wstawienia wartości domyślnej zdefiniowanej dla kolumny. Jeśli wartość domyślna nie istnieje dla kolumny, a kolumna zezwala na wartości null, NULL jest wstawiony. DEFAULT nie może być używany w kolumnach tożsamości.

Przykłady

Oto kilka przykładów pokazujących, jak VALUES może być używany w SQL Server.

Używane w INSERT Oświadczenie

Oto przykład użycia VALUES klauzula jako część INSERT oświadczenie:

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

To stworzyło tabelę o nazwie Idiots i wstawił do niego trzy rzędy.

Możemy teraz użyć SELECT oświadczenie, aby zobaczyć nowe wartości w tabeli:

SELECT * FROM Idiots;

Wynik:

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

Gdy VALUES klauzula jest używana w INSERT oświadczenie, istnieje limit 1000 wierszy. Jednym ze sposobów rozwiązania tego problemu jest użycie VALUES w SELECT instrukcja, aby utworzyć tabelę pochodną. To oszczędza nam konieczności używania wielu INSERT oświadczenia lub robienie wstawek zbiorczych.

Używane w SELECT Oświadczenie

Możemy użyć VALUES aby utworzyć tabelę pochodną w FROM klauzula. Oto SELECT oświadczenie do zademonstrowania:

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

Wynik:

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

Tabele pochodne można wykorzystać do przekroczenia limitu 1000 wierszy podczas wstawiania wartości do bazy danych.

Używane w MERGE Oświadczenie

Oto przykład VALUES używane w MERGE oświadczenie:

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;

Wynik:

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

W tym przypadku zaktualizowano jeden wiersz i wstawiono dwa nowe wiersze na podstawie wartości podanych w VALUES klauzula.

Oto wynikowa tabela teraz:

SELECT * FROM Idiots;

Wynik:

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy SQL Server może wysłać żądanie internetowe?

  2. SQL - Zapytanie o adres IP serwera

  3. Architektura programu SQL Server AlwaysOn (grupa dostępności) i instalacja krok po kroku — 3 kroki ręcznego przełączania awaryjnego

  4. Błąd serwera SQL 109:W instrukcji INSERT jest więcej kolumn niż wartości określonych w klauzuli VALUES

  5. SQL Server SELECT do istniejącej tabeli