sql >> Database teknologi >  >> RDS >> Sqlserver

VALUES-klausul i SQL Server

I SQL Server, VALUES er en tabelværdikonstruktør, der specificerer et sæt rækkeværdiudtryk, der skal konstrueres til en tabel.

VALUES klausul bruges ofte sammen med INSERT sætninger til at indsætte data, men det kan også bruges som en afledt tabel i enten USING klausul i MERGE sætning eller FROM klausul.

Syntaks

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

Bemærk, at DEFAULT er kun tilladt i en INSERT udmelding. DEFAULT tvinger SQL Server til at indsætte standardværdien defineret for kolonnen. Hvis der ikke findes en standard for kolonnen, og kolonnen tillader null-værdier, NULL er indsat. DEFAULT kan ikke bruges på identitetskolonner.

Eksempler

Her er nogle eksempler, der viser, hvordan VALUES kan bruges i SQL Server.

Bruges i en INSERT Erklæring

Her er et eksempel på brug af VALUES klausul som en del af en INSERT erklæring:

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 skabte en tabel kaldet Idiots og indsatte tre rækker i den.

Vi kan nu bruge en SELECT sætning for at se de nye værdier i tabellen:

SELECT * FROM Idiots; 

Resultat:

+-------+-------------+------------+| IdiotId | Fornavn | Efternavn ||-----------+-------------+-----------|| 1 | Peter | Griffin || 2 | Homer | Simpson || 3 | Ned | Flandern |+-----------+-------------+------------+

Når VALUES klausul bruges i en INSERT sætning, er der en grænse på 1000 rækker. En måde at overvinde dette på er at bruge VALUES i en SELECT sætning for at oprette en afledt tabel. Det sparer os for at skulle bruge flere INSERT udsagn eller lave en masseindsættelse.

Bruges i en SELECT Erklæring

Vi kan bruge VALUES at oprette en afledt tabel i FROM klausul. Her er en SELECT erklæring for at demonstrere:

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

Resultat:

+-------------+------------+| Fornavn | Efternavn ||-------------+------------|| Homer | Simpson |+-------------+------------+

Afledte tabeller kan bruges til at overvinde grænsen på 1000 rækker, når du indsætter værdier i en database.

Bruges i en MERGE Erklæring

Her er et eksempel på VALUES bliver brugt i en MERGE erklæring:

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:

+----------+---------+| Skift | Tæl ||---------+---------|| INDSÆT | 2 || OPDATERING | 1 |+----------+---------+

I dette tilfælde blev en række opdateret, og to nye rækker blev indsat, baseret på værdierne angivet i VALUES klausul.

Her er den resulterende tabel nu:

SELECT * FROM Idiots; 

Resultat:

+-------+-------------------+| IdiotId | Fornavn | Efternavn ||-----------+-------------+--------------------|| 1 | Peter | Griffin || 2 | Homer | Simpson || 3 | Ned | Oki Dokily! || 4 | Lloyd | jul || 5 | Harry | Dunne |+-----------+-------------+---------+

  1. Sådan opretter du en unik begrænsning på kolonne for allerede eksisterende tabel - SQL Server / TSQL vejledning del 97

  2. CASE .. WHEN udtryk i Oracle SQL

  3. MySQL InnoDB frigiver ikke diskplads efter sletning af datarækker fra tabellen

  4. Mislykket bygningshjul til psychopg2 - MacOSX ved hjælp af virtualenv og pip