Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Baza 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:
Utwórz wiele
INSERTinstrukcji.Użyj tabeli pochodnej.
Zbiorczo zaimportuj dane przy użyciu narzędzia bcp, klasy .NET SqlBulkCopy, metody OPENROWSET BULK lub instrukcji BULK INSERT .
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]);