Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
              Van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-database in Microsoft Fabric Preview
Hiermee geeft u een set expressies voor rijwaarden op die in een tabel moeten worden samengesteld. Met de Transact-SQL tabelwaardeconstructor kunnen meerdere rijen met gegevens worden opgegeven in één DML-instructie. De tabelwaardeconstructor kan worden opgegeven als de VALUES component van een INSERT ... VALUES instructie of als een afgeleide tabel in de component van de USINGMERGE instructie of de FROM component.
              
              
              Transact-SQL syntaxis-conventies
Syntax
VALUES ( <row value expression list> ) [ ,...n ]   
<row value expression list> ::=  
    {<row value expression> } [ ,...n ]  
<row value expression> ::=  
    { DEFAULT | NULL | expression }  
Arguments
VALUES
Introduceert de lijsten met expressies voor rijwaarden. Elke lijst moet tussen haakjes worden geplaatst en gescheiden door een komma.
Het aantal waarden dat in elke lijst is opgegeven, moet hetzelfde zijn en de waarden moeten zich in dezelfde volgorde bevinden als de kolommen in de tabel. Een waarde voor elke kolom in de tabel moet worden opgegeven of de kolomlijst moet expliciet de kolommen voor elke binnenkomende waarde opgeven.
DEFAULT
Hiermee dwingt u af dat de database-engine de standaardwaarde invoegt die is gedefinieerd voor een kolom. Als er geen standaardwaarde bestaat voor de kolom en de kolom null-waarden toestaat, NULL wordt ingevoegd. 
              DEFAULT is niet geldig voor een identiteitskolom. Wanneer deze is opgegeven in een tabelwaardeconstructor, DEFAULT is dit alleen toegestaan in een INSERT instructie.
expression
Een constante, een variabele of een expressie. De expressie mag geen instructie bevatten EXECUTE .
Limitations
Wanneer deze wordt gebruikt als een afgeleide tabel, is er geen limiet voor het aantal rijen.
Wanneer deze wordt gebruikt als component VALUES van een INSERT ... VALUES instructie, is er een limiet van 1000 rijen. Fout 10738 wordt geretourneerd als het aantal rijen het maximum overschrijdt. Als u meer dan 1000 rijen wilt invoegen, gebruikt u een van de volgende methoden:
- INSERTMeerdere instructies maken.
- Gebruik een afgeleide tabel. 
- Importeer de gegevens bulksgewijs met behulp van het hulpprogramma bcp, de .NET SqlBulkCopy-klasse, OPENROWSET BULK of de instructie BULK INSERT . 
Alleen enkele scalaire waarden zijn toegestaan als een rijwaarde-expressie. Een subquery waarbij meerdere kolommen zijn betrokken, is niet toegestaan als een expressie voor rijwaarden. De volgende code resulteert bijvoorbeeld in een syntaxisfout omdat de lijst met expressies voor de derde rijwaarde een subquery met meerdere kolommen bevat.
USE AdventureWorks2022;  
GO  
CREATE TABLE dbo.MyProducts (Name VARCHAR(50), ListPrice MONEY);  
GO  
-- This statement fails because the third values list contains multiple columns in the subquery.  
INSERT INTO dbo.MyProducts (Name, ListPrice)  
VALUES ('Helmet', 25.50),  
       ('Wheel', 30.00),  
       (SELECT Name, ListPrice FROM Production.Product WHERE ProductID = 720);  
GO  
De instructie kan echter opnieuw worden geschreven door elke kolom in de subquery afzonderlijk op te geven. In het volgende voorbeeld worden drie rijen in de MyProducts tabel ingevoegd.
INSERT INTO dbo.MyProducts (Name, ListPrice)  
VALUES ('Helmet', 25.50),  
       ('Wheel', 30.00),  
       ((SELECT Name FROM Production.Product WHERE ProductID = 720),  
        (SELECT ListPrice FROM Production.Product WHERE ProductID = 720));  
GO  
Data types
De waarden die zijn opgegeven in een instructie met meerdere rijen INSERT volgen de eigenschappen van de conversie van het gegevenstype van de UNION ALL syntaxis. Dit resulteert in de impliciete conversie van niet-overeenkomende typen naar het type hogere prioriteit voor gegevenstypen. Als de conversie geen ondersteunde impliciete conversie is, wordt er een fout geretourneerd. Met de volgende instructie wordt bijvoorbeeld een geheel getal en een tekenwaarde ingevoegd in een kolom van het type char.
CREATE TABLE dbo.t (a INT, b CHAR);  
GO  
INSERT INTO dbo.t VALUES (1,'a'), (2, 1);  
GO  
Wanneer de INSERT instructie wordt uitgevoerd, probeert SQL Server 'a' te converteren naar een geheel getal omdat de prioriteit van het gegevenstype aangeeft dat een geheel getal van een hoger type is dan een teken. De conversie mislukt en er wordt een fout geretourneerd. U kunt de fout vermijden door waarden expliciet naar wens te converteren. De vorige instructie kan bijvoorbeeld als volgt worden geschreven.
INSERT INTO dbo.t VALUES (1,'a'), (2, CONVERT(CHAR,1));  
Examples
A. Meerdere rijen met gegevens invoegen
In het volgende voorbeeld wordt de tabel dbo.Departments gemaakt en vervolgens de tabelwaardeconstructor gebruikt om vijf rijen in de tabel in te voegen. Omdat waarden voor alle kolommen worden opgegeven en in dezelfde volgorde worden weergegeven als de kolommen in de tabel, hoeven de kolomnamen niet in de kolomlijst te worden opgegeven.
USE AdventureWorks2022;  
GO  
INSERT INTO Production.UnitMeasure  
VALUES (N'FT2', N'Square Feet ', '20080923'), (N'Y', N'Yards', '20080923'),
       (N'Y3', N'Cubic Yards', '20080923');  
GO  
B. Meerdere rijen met STANDAARD- en NULL-waarden invoegen
In het volgende voorbeeld ziet u hoe u de tabelwaardeconstructor opgeeft DEFAULT en NULL wanneer u rijen in een tabel invoegt.
USE AdventureWorks2022;  
GO  
CREATE TABLE Sales.MySalesReason(  
SalesReasonID int IDENTITY(1,1) NOT NULL,  
Name dbo.Name NULL ,  
ReasonType dbo.Name NOT NULL DEFAULT 'Not Applicable' );  
GO  
INSERT INTO Sales.MySalesReason   
VALUES ('Recommendation','Other'), ('Advertisement', DEFAULT), (NULL, 'Promotion');  
SELECT * FROM Sales.MySalesReason;  
C. Meerdere waarden opgeven als een afgeleide tabel in een FROM-component
In de volgende voorbeelden wordt de constructor voor tabelwaarden gebruikt om meerdere waarden op te geven in de FROM component van een SELECT instructie.
SELECT a, b FROM (VALUES (1, 2), (3, 4), (5, 6), (7, 8), (9, 10) ) AS MyTable(a, b);  
GO  
-- Used in an inner join to specify values to return.  
SELECT ProductID, a.Name, Color  
FROM Production.Product AS a  
INNER JOIN (VALUES ('Blade'), ('Crown Race'), ('AWC Logo Cap')) AS b(Name)   
ON a.Name = b.Name;  
D. Meerdere waarden opgeven als een afgeleide brontabel in een MERGE-instructie
In het volgende voorbeeld wordt de MERGESalesReason tabel gewijzigd door rijen bij te werken of in te voegen. Wanneer de waarde van NewName in de brontabel overeenkomt met een waarde in de Name kolom van de doeltabel (SalesReason), wordt de ReasonType kolom bijgewerkt in de doeltabel. Als de waarde van NewName deze waarde niet overeenkomt, wordt de bronrij ingevoegd in de doeltabel. De brontabel is een afgeleide tabel die gebruikmaakt van de Transact-SQL tabelwaardeconstructor om meerdere rijen voor de brontabel op te geven.
USE AdventureWorks2022;  
GO  
-- Create a temporary table variable to hold the output actions.  
DECLARE @SummaryOfChanges TABLE(Change VARCHAR(20));  
MERGE INTO Sales.SalesReason AS Target  
USING (VALUES ('Recommendation','Other'), ('Review', 'Marketing'), ('Internet', 'Promotion'))  
       AS Source (NewName, NewReasonType)  
ON Target.Name = Source.NewName  
WHEN MATCHED THEN  
UPDATE SET ReasonType = Source.NewReasonType  
WHEN NOT MATCHED BY TARGET THEN  
INSERT (Name, ReasonType) VALUES (NewName, NewReasonType)  
OUTPUT $action INTO @SummaryOfChanges;  
-- Query the results of the table variable.  
SELECT Change, COUNT(*) AS CountPerChange  
FROM @SummaryOfChanges  
GROUP BY Change;  
E. Meer dan 1000 rijen invoegen
In het volgende voorbeeld ziet u hoe u de tabelwaardeconstructor gebruikt als een afgeleide tabel. Hierdoor kunnen meer dan 1000 rijen worden ingevoegd vanuit één tabelwaardeconstructor.
CREATE TABLE dbo.Test ([Value] INT);  
INSERT INTO dbo.Test ([Value])  
  SELECT drvd.[NewVal]
  FROM   (VALUES (0), (1), (2), (3), ..., (5000)) drvd([NewVal]);