Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
              Gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-databas i Förhandsversion av Microsoft Fabric
Anger en uppsättning radvärdeuttryck som ska konstrueras i en tabell. Med Transact-SQL tabellvärdekonstruktor kan flera rader med data anges i en enda DML-instruktion. Tabellvärdekonstruktorn kan anges antingen som -sats för VALUES en INSERT ... VALUES -instruktion eller som en härledd tabell i antingen USING -instruktionens MERGE sats eller FROM -satsen.
              
              
              Transact-SQL syntaxkonventioner
Syntax
VALUES ( <row value expression list> ) [ ,...n ]   
<row value expression list> ::=  
    {<row value expression> } [ ,...n ]  
<row value expression> ::=  
    { DEFAULT | NULL | expression }  
Arguments
VALUES
Introducerar uttryckslistorna för radvärde. Varje lista måste omges av parenteser och avgränsas med ett kommatecken.
Antalet värden som anges i varje lista måste vara detsamma och värdena måste vara i samma ordning som kolumnerna i tabellen. Ett värde för varje kolumn i tabellen måste anges eller så måste kolumnlistan uttryckligen ange kolumnerna för varje inkommande värde.
DEFAULT
Tvingar databasmotorn att infoga standardvärdet som definierats för en kolumn. Om det inte finns något standardvärde för kolumnen och kolumnen tillåter null-värden infogas NULL . 
              DEFAULT är inte giltigt för en identitetskolumn. När det anges i en tabellvärdekonstruktor DEFAULT tillåts endast i en INSERT -instruktion.
expression
En konstant, en variabel eller ett uttryck. Uttrycket får inte innehålla en EXECUTE -instruktion.
Limitations
När den används som en härledd tabell finns det ingen gräns för antalet rader.
När den används som sats för VALUES en INSERT ... VALUES -instruktion finns det en gräns på 1 000 rader. Fel 10738 returneras om antalet rader överskrider maxgränsen. Om du vill infoga fler än 1 000 rader använder du någon av följande metoder:
- Skapa flera - INSERTinstruktioner.
- Använd en härledd tabell. 
- Massimportera data med hjälp av bcp-verktyget, .NET SqlBulkCopy-klassen, OPENROWSET BULK eller BULK INSERT-instruktionen . 
Endast enskilda skalärvärden tillåts som ett radvärdeuttryck. En underfråga som omfattar flera kolumner tillåts inte som ett radvärdeuttryck. Följande kod resulterar till exempel i ett syntaxfel eftersom den tredje radens värdeuttryckslista innehåller en underfråga med flera kolumner.
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  
Instruktionen kan dock skrivas om genom att ange varje kolumn i underfrågan separat. I följande exempel infogas tre rader i MyProducts tabellen.
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
Värdena som anges i en instruktion med flera rader INSERT följer syntaxens UNION ALL datatypkonverteringsegenskaper. Detta resulterar i implicit konvertering av omatchade typer till typen av högre datatypprioriteten. Om konverteringen inte är en implicit konvertering som stöds returneras ett fel. Följande instruktion infogar till exempel ett heltalsvärde och ett teckenvärde i en kolumn av typen tecken.
CREATE TABLE dbo.t (a INT, b CHAR);  
GO  
INSERT INTO dbo.t VALUES (1,'a'), (2, 1);  
GO  
När instruktionen INSERT körs försöker SQL Server konvertera "a" till ett heltal eftersom datatypens prioritet anger att ett heltal är av en högre typ än ett tecken. Konverteringen misslyckas och ett fel returneras. Du kan undvika felet genom att uttryckligen konvertera värden efter behov. Den tidigare instruktionen kan till exempel skrivas på följande sätt.
INSERT INTO dbo.t VALUES (1,'a'), (2, CONVERT(CHAR,1));  
Examples
A. Infoga flera rader med data
Följande exempel skapar tabellen dbo.Departments och använder sedan tabellvärdekonstruktorn för att infoga fem rader i tabellen. Eftersom värden för alla kolumner anges och visas i samma ordning som kolumnerna i tabellen behöver kolumnnamnen inte anges i kolumnlistan.
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. Infoga flera rader med STANDARD- och NULL-värden
I följande exempel visas hur DEFAULT du anger och NULL när du använder tabellvärdekonstruktorn för att infoga rader i en tabell.
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. Ange flera värden som en härledd tabell i en FROM-sats
I följande exempel används tabellvärdekonstruktorn för att ange flera värden i instruktionens FROM sats SELECT .
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. Ange flera värden som en härledd källtabell i en MERGE-instruktion
I följande exempel används MERGE för att ändra SalesReason tabellen genom att antingen uppdatera eller infoga rader. När värdet NewName för i källtabellen matchar ett värde i kolumnen i Name måltabellen (SalesReason) ReasonType uppdateras kolumnen i måltabellen. När värdet NewName för inte matchar infogas källraden i måltabellen. Källtabellen är en härledd tabell som använder Transact-SQL tabellvärdekonstruktorn för att ange flera rader för källtabellen.
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. Infoga fler än 1 000 rader
I följande exempel visas hur du använder tabellvärdekonstruktorn som en härledd tabell. Detta gör det möjligt att infoga mer än 1 000 rader från en enskild tabellvärdekonstruktor.
CREATE TABLE dbo.Test ([Value] INT);  
INSERT INTO dbo.Test ([Value])  
  SELECT drvd.[NewVal]
  FROM   (VALUES (0), (1), (2), (3), ..., (5000)) drvd([NewVal]);