sql >> Database >  >> RDS >> Sqlserver

WAARDEN-clausule in SQL Server

In SQL Server, VALUES is een tabelwaardeconstructor die een reeks rijwaarde-expressies specificeert die in een tabel moeten worden geconstrueerd.

De VALUES clausule wordt vaak gebruikt met INSERT instructies om gegevens in te voegen, maar het kan ook worden gebruikt als een afgeleide tabel in de USING clausule van de MERGE statement of de FROM clausule.

Syntaxis

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

Merk op dat DEFAULT is alleen toegestaan ​​in een INSERT uitspraak. DEFAULT dwingt SQL Server om de standaardwaarde in te voegen die voor de kolom is gedefinieerd. Als er geen standaard voor de kolom bestaat en de kolom staat null-waarden toe, NULL wordt ingevoegd. DEFAULT kan niet worden gebruikt op identiteitskolommen.

Voorbeelden

Hier zijn enkele voorbeelden die laten zien hoe VALUES kan worden gebruikt in SQL Server.

Gebruikt in een INSERT Verklaring

Hier is een voorbeeld van het gebruik van de VALUES clausule als onderdeel van een INSERT verklaring:

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

Dat creëerde een tabel met de naam Idiots en voegde er drie rijen in.

We kunnen nu een SELECT . gebruiken statement om de nieuwe waarden in de tabel te zien:

SELECT * FROM Idiots;

Resultaat:

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

Wanneer de VALUES clausule wordt gebruikt in een INSERT statement, is er een limiet van 1000 rijen. Een manier om dit te verhelpen is door VALUES . te gebruiken in een SELECT statement om een ​​afgeleide tabel te maken. Dat bespaart ons het gebruik van meerdere INSERT verklaringen of het doen van een bulkinvoeging.

Gebruikt in een SELECT Verklaring

We kunnen VALUES . gebruiken om een ​​afgeleide tabel te maken in de FROM clausule. Hier is een SELECT verklaring om aan te tonen:

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

Resultaat:

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

Afgeleide tabellen kunnen worden gebruikt om de limiet van 1000 rijen te overschrijden bij het invoegen van waarden in een database.

Gebruikt in een MERGE Verklaring

Hier is een voorbeeld van VALUES wordt gebruikt in een MERGE verklaring:

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;

Resultaat:

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

In dit geval is één rij bijgewerkt en zijn er twee nieuwe rijen ingevoegd, gebaseerd op de waarden in de VALUES clausule.

Dit is nu de resulterende tabel:

SELECT * FROM Idiots;

Resultaat:

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

  1. MySQL DATEDIFF() vs TIMEDIFF():wat is het verschil?

  2. Beschermt mysql_real_escape_string() VOLLEDIG tegen SQL-injectie?

  3. Gegevens worden ingevuld vanaf de datum van een bepaalde tabel in plaats van alle tabellen in sqlite

  4. Soorten tabelrelaties in MS Access