Udostępnij za pomocą


Konstruktor wartości tabeli (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBaza danych SQL w usłudze Microsoft Fabric

Określa zestaw wyrażeń wartości wiersza, które mają być skonstruowane w tabeli. Konstruktor wartości tabeli Transact-SQL umożliwia określenie wielu wierszy danych w jednej instrukcji DML. Konstruktor wartości tabeli można określić jako VALUES klauzulę INSERT ... VALUES instrukcji lub jako tabelę pochodną w USING klauzuli MERGE instrukcji lub klauzuli FROM .

Transact-SQL konwencje składni

Syntax

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

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

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

Arguments

VALUES

Wprowadza listę wyrażeń wartości wiersza. Każda lista musi być ujęta w nawiasy i oddzielona przecinkami.

Liczba wartości określonych na każdej liście musi być taka sama, a wartości muszą być w tej samej kolejności co kolumny w tabeli. Wartość każdej kolumny w tabeli musi być określona lub lista kolumn musi jawnie określać kolumny dla każdej wartości przychodzącej.

DEFAULT

Wymusza, aby aparat bazy danych wstawił wartość domyślną zdefiniowaną dla kolumny. Jeśli dla kolumny nie istnieje wartość domyślna, a kolumna zezwala na wartości null, NULL zostanie wstawiona. DEFAULT kolumna tożsamości jest nieprawidłowa. W przypadku określenia w konstruktorze DEFAULT wartości tabeli dozwolone jest tylko w instrukcji INSERT .

expression

Stała, zmienna lub wyrażenie. Wyrażenie nie może zawierać instrukcji EXECUTE .

Limitations

W przypadku użycia jako tabeli pochodnej nie ma limitu liczby wierszy.

W przypadku użycia jako VALUES klauzuli instrukcji INSERT ... VALUES limit wynosi 1000 wierszy. Błąd 10738 jest zwracany, jeśli liczba wierszy przekracza wartość maksymalną. Aby wstawić więcej niż 1000 wierszy, użyj jednej z następujących metod:

Tylko pojedyncze wartości skalarne są dozwolone jako wyrażenie wartości wiersza. Podzapytywanie obejmujące wiele kolumn nie jest dozwolone jako wyrażenie wartości wiersza. Na przykład poniższy kod powoduje błąd składniowy, ponieważ lista wyrażeń wartości trzeciego wiersza zawiera podzapytywanie z wieloma kolumnami.

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  

Jednak instrukcję można przepisać, określając każdą kolumnę w podzapytaniu oddzielnie. Poniższy przykład pomyślnie wstawia trzy wiersze do MyProducts tabeli.

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  

Typy danych

Wartości określone w instrukcji z wieloma wierszami INSERT są zgodne z właściwościami UNION ALL konwersji typu danych składni. Powoduje to niejawną konwersję niezgodnych typów na typ wyższego pierwszeństwa typu danych. Jeśli konwersja nie jest obsługiwaną niejawną konwersją, zwracany jest błąd. Na przykład poniższa instrukcja wstawia wartość całkowitą i wartość znaku do kolumny typu char.

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

Po uruchomieniu INSERT instrukcji program SQL Server próbuje przekonwertować znak "a" na liczbę całkowitą, ponieważ pierwszeństwo typu danych wskazuje, że liczba całkowita ma wyższy typ niż znak. Konwersja kończy się niepowodzeniem i zwracany jest błąd. Możesz uniknąć błędu, jawnie konwertując wartości odpowiednio. Na przykład poprzednia instrukcja może być napisana w następujący sposób.

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

Examples

A. Wstaw wiele wierszy danych

Poniższy przykład tworzy tabelę dbo.Departments , a następnie używa konstruktora wartości tabeli do wstawiania pięciu wierszy do tabeli. Ponieważ podano wartości dla wszystkich kolumn i są wymienione w tej samej kolejności co kolumny w tabeli, nazwy kolumn nie muszą być określone na liście kolumn.

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. Wstaw wiele wierszy z wartościami DEFAULT i NULL

W poniższym przykładzie pokazano określanie DEFAULTNULL i używanie konstruktora wartości tabeli do wstawiania wierszy do tabeli.

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. Określanie wielu wartości jako tabeli pochodnej w klauzuli FROM

W poniższych przykładach użyto konstruktora wartości tabeli, aby określić wiele wartości w FROM klauzuli instrukcji 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. Określanie wielu wartości jako tabeli źródłowej pochodnej w instrukcji MERGE

W poniższym przykładzie użyto MERGE metody modyfikowania SalesReason tabeli przez aktualizowanie lub wstawianie wierszy. Gdy wartość NewName w tabeli źródłowej jest zgodna z wartością w Name kolumnie tabeli docelowej (SalesReason), kolumna ReasonType zostanie zaktualizowana w tabeli docelowej. Gdy wartość nie jest zgodna NewName , wiersz źródłowy zostanie wstawiony do tabeli docelowej. Tabela źródłowa jest tabelą pochodną, która używa konstruktora wartości tabeli Transact-SQL do określenia wielu wierszy dla tabeli źródłowej.

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. Wstaw więcej niż 1000 wierszy

W poniższym przykładzie pokazano użycie konstruktora wartości tabeli jako tabeli pochodnej. Umożliwia to wstawianie ponad 1000 wierszy z jednego konstruktora wartości tabeli.

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

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