sql >> Databasteknik >  >> RDS >> Sqlserver

VALUES-sats i SQL Server

I SQL Server, VALUES är en tabellvärdekonstruktor som specificerar en uppsättning radvärdeuttryck som ska konstrueras till en tabell.

VALUES sats används ofta med INSERT satser för att infoga data, men det kan också användas som en härledd tabell i antingen USING satsen i MERGE eller FROM klausul.

Syntax

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

Observera att DEFAULT tillåts endast i en INSERT påstående. DEFAULT tvingar SQL Server att infoga standardvärdet som definierats för kolumnen. Om en standard inte finns för kolumnen och kolumnen tillåter null-värden, NULL förs in. DEFAULT kan inte användas på identitetskolumner.

Exempel

Här är några exempel som visar hur VALUES kan användas i SQL Server.

Används i en INSERT Uttalande

Här är ett exempel på hur du använder VALUES sats som en del av en INSERT uttalande:

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

Det skapade en tabell som heter Idiots och infogade tre rader i den.

Vi kan nu använda en SELECT uttalande för att se de nya värdena i tabellen:

SELECT * FROM Idiots;

Resultat:

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

När VALUES sats används i en INSERT uttalande, det finns en gräns på 1000 rader. Ett sätt att övervinna detta är att använda VALUES i en SELECT uttalande för att skapa en härledd tabell. Det räddar oss från att behöva använda flera INSERT uttalanden eller göra en massinsättning.

Används i en SELECT Uttalande

Vi kan använda VALUES för att skapa en härledd tabell i FROM klausul. Här är en SELECT uttalande för att visa:

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

Resultat:

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

Härledda tabeller kan användas för att övervinna gränsen på 1000 rader när värden infogas i en databas.

Används i en MERGE Uttalande

Här är ett exempel på VALUES används i en MERGE uttalande:

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;

Resultat:

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

I det här fallet uppdaterades en rad och två nya rader infogades, baserat på värdena i VALUES klausul.

Här är den resulterande tabellen nu:

SELECT * FROM Idiots;

Resultat:

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

  1. Fråga extremt långsam i koden men snabb i SSMS

  2. Logisk replikeringspartitionering med PostgreSQL 13

  3. NLSSORT() Funktion i Oracle

  4. SQLite Visa tabeller