Megosztás a következőn keresztül:


Táblaérték-konstruktor (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példánySQL-adatbázis a Microsoft Fabricben

A táblába építendő sorértékkifejezések halmazát adja meg. A Transact-SQL tábla értékkonstruktorával több adatsor is megadható egyetlen DML-utasításban. A táblaérték-konstruktor megadható egy utasítás záradékaként VALUESINSERT ... VALUES, vagy származtatott táblaként az USING utasítás vagy a MERGEFROM záradék záradékában.

Transact-SQL szintaxis konvenciók

Syntax

VALUES ( <row value expression list> ) [ ,...n ]   

<row value expression list> ::=  
    {<row value expression> } [ ,...n ]  

<row value expression> ::=  
    { DEFAULT | NULL | expression }  

Arguments

VALUES

Bemutatja a sorérték-kifejezéslistákat. Minden listát zárójelben kell megadni, és vesszővel kell elválasztani.

Az egyes listában megadott értékek számának meg kell egyeznie, és az értékeknek ugyanabban a sorrendben kell lenniük, mint a táblázat oszlopai. Meg kell adni egy értéket a tábla minden oszlopához, vagy az oszloplistának explicit módon kell megadnia az egyes bejövő értékek oszlopait.

DEFAULT

Kényszeríti az adatbázismotort, hogy beszúrja az oszlophoz definiált alapértelmezett értéket. Ha nem létezik alapértelmezett érték az oszlophoz, és az oszlop null értékeket engedélyez, NULL akkor a rendszer beszúrja. DEFAULT érvénytelen identitásoszlop esetén. Ha táblaérték-konstruktorban van megadva, DEFAULT csak utasításban INSERT engedélyezett.

expression

Állandó, változó vagy kifejezés. A kifejezés nem tartalmazhat utasítást EXECUTE .

Limitations

Származtatott táblaként használva a sorok száma nincs korlátozva.

Ha egy VALUESINSERT ... VALUES utasítás záradékaként használják, 1000 sorból álló korlát van. Az 10738-es hiba akkor jelenik meg, ha a sorok száma meghaladja a maximális értéket. Több mint 1000 sor beszúrásához használja az alábbi módszerek egyikét:

Sorértékkifejezésként csak egyetlen skaláris érték engedélyezett. A több oszlopot tartalmazó al lekérdezések nem használhatók sorérték-kifejezésként. Az alábbi kód például szintaxishibát eredményez, mert a harmadik sorérték kifejezéslistája több oszlopból áll.

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  

Az utasítás azonban átírható úgy, hogy az al lekérdezés minden oszlopát külön adja meg. Az alábbi példa sikeresen beszúr három sort a MyProducts táblába.

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  

Adattípusok

A többsoros INSERT utasításban megadott értékek a szintaxis adattípus-konvertálási UNION ALL tulajdonságait követik. Ez a nem egyező típusok implicit konvertálását eredményezi magasabb adattípus-elsőbbségi típusra. Ha az átalakítás nem támogatott implicit konverzió, hibaüzenet jelenik meg. Az alábbi utasítás például egy egész számot és egy karakterértéket szúr be egy karakter típusú oszlopba.

CREATE TABLE dbo.t (a INT, b CHAR);  
GO  
INSERT INTO dbo.t VALUES (1,'a'), (2, 1);  
GO  

Az utasítás futtatásakor az INSERT SQL Server egész számmá próbálja konvertálni az "a"-t, mert az adattípus elsőbbsége azt jelzi, hogy az egész szám magasabb típusú, mint egy karakter. Az átalakítás sikertelen, és a függvény hibát ad vissza. A hiba elkerülése érdekében szükség szerint explicit módon konvertálja az értékeket. Az előző utasítás például a következőképpen írható meg.

INSERT INTO dbo.t VALUES (1,'a'), (2, CONVERT(CHAR,1));  

Examples

A. Több adatsor beszúrása

Az alábbi példa létrehozza a táblát dbo.Departments , majd a tábla értékkonstruktorával öt sort szúr be a táblába. Mivel az összes oszlop értékei meg vannak adva, és ugyanabban a sorrendben vannak felsorolva, mint a táblázat oszlopai, az oszlopneveket nem kell megadni az oszloplistában.

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. Több sor beszúrása ALAPÉRTELMEZETT és NULL értékekkel

Az alábbi példa bemutatja, DEFAULT hogy a tábla értékkonstruktorával mikor és NULL milyen esetekben szúrhat be sorokat egy táblába.

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. Több érték megadása származtatott táblaként egy FROM záradékban

Az alábbi példák a tábla értékkonstruktorával több értéket is meghatároznak egy FROMSELECT utasítás záradékában.

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. Több érték megadása származtatott forrástáblaként a MERGE utasításban

Az alábbi példa MERGE sorok frissítésével vagy beszúrásával módosítja a SalesReason táblázatot. Ha a forrástábla értéke NewName megegyezik a Name céltáblaSalesReason () oszlopában lévő értékkel, az ReasonType oszlop frissül a céltáblában. Ha az érték NewName nem egyezik, a forrássor be lesz szúrva a céltáblába. A forrástábla egy származtatott tábla, amely a Transact-SQL tábla értékkonstruktorával több sort ad meg a forrástábla számára.

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. Több mint 1000 sor beszúrása

Az alábbi példa bemutatja, hogy a tábla értékkonstruktorát származtatott táblaként használja. Ez lehetővé teszi több mint 1000 sor beszúrását egyetlen táblaérték-konstruktorból.

CREATE TABLE dbo.Test ([Value] INT);  

INSERT INTO dbo.Test ([Value])  
  SELECT drvd.[NewVal]
  FROM   (VALUES (0), (1), (2), (3), ..., (5000)) drvd([NewVal]);