Aracılığıyla paylaş


Tablo Değeri Oluşturucu (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft Fabric'te SQL veritabanı

Tabloya oluşturulacak satır değeri ifadeleri kümesini belirtir. Transact-SQL tablo değeri oluşturucu, tek bir DML deyiminde birden çok veri satırı belirtilmesine izin verir. Tablo değeri oluşturucu, deyiminin VALUESINSERT ... VALUES yan tümcesi olarak veya deyiminin yan tümcesinde USINGMERGEFROM türetilmiş bir tablo olarak belirtilebilir.

Transact-SQL söz dizimi kuralları

Syntax

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

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

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

Arguments

VALUES

Satır değeri ifade listelerini tanıtır. Her liste parantez içine alınmalı ve virgülle ayrılmalıdır.

Her listede belirtilen değerlerin sayısı aynı olmalı ve değerler tablodaki sütunlarla aynı sırada olmalıdır. Tablodaki her sütun için bir değer belirtilmeli veya sütun listesi gelen her değer için sütunları açıkça belirtmelidir.

DEFAULT

Veritabanı Altyapısı'nı bir sütun için tanımlanan varsayılan değeri eklemeye zorlar. Sütun için varsayılan değer yoksa ve sütun null değerlere izin veriyorsa eklenir NULL . DEFAULT bir kimlik sütunu için geçerli değil. Tablo değeri oluşturucusunda belirtildiğinde, DEFAULT yalnızca bir INSERT deyimde izin verilir.

expression

Sabit, değişken veya ifade. İfade bir EXECUTE deyim içeremez.

Limitations

Türetilmiş tablo olarak kullanıldığında, satır sayısıyla ilgili bir sınır yoktur.

Bir VALUES deyiminin INSERT ... VALUES yan tümcesi olarak kullanıldığında, 1.000 satır sınırı vardır. Satır sayısı üst sınırı aşarsa hata 10738 döndürülür. 1.000'den fazla satır eklemek için aşağıdaki yöntemlerden birini kullanın:

Satır değeri ifadesi olarak yalnızca tek skaler değerlere izin verilir. Satır değeri ifadesi olarak birden çok sütun içeren bir alt sorguya izin verilmez. Örneğin, üçüncü satır değeri ifade listesinde birden çok sütun içeren bir alt sorgu bulunduğundan aşağıdaki kod söz dizimi hatasıyla sonuçlanır.

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  

Ancak, alt sorgudaki her sütun ayrı ayrı belirtilerek deyimi yeniden yazılabilir. Aşağıdaki örnek tabloya MyProducts üç satırı başarıyla ekler.

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  

Veri türleri

Çok satırlı INSERT bir deyimde belirtilen değerler söz diziminin UNION ALL veri türü dönüştürme özelliklerini izler. Bu, eşleşmeyen türlerin daha yüksek veri türü önceliği türüne örtük olarak dönüştürülmesiyle sonuçlanır. Dönüştürme desteklenen bir örtük dönüştürme değilse bir hata döndürülür. Örneğin, aşağıdaki deyim char türünde bir sütuna bir tamsayı değeri ve karakter değeri ekler.

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

INSERT Deyimi çalıştırıldığında, veri türü önceliği bir tamsayının karakterden daha yüksek bir türde olduğunu gösterdiğinden, SQL Server 'a' öğesini tamsayıya dönüştürmeye çalışır. Dönüştürme başarısız olur ve bir hata döndürülür. Değerleri açıkça uygun şekilde dönüştürerek hatadan kaçınabilirsiniz. Örneğin, önceki ifade aşağıdaki gibi yazılabilir.

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

Examples

A. Birden çok veri satırı ekleme

Aşağıdaki örnek tabloyu dbo.Departments oluşturur ve tabloya beş satır eklemek için tablo değeri oluşturucuyu kullanır. Tüm sütunların değerleri sağlandığından ve tablodaki sütunlarla aynı sırada listelendiği için, sütun listesinde sütun adlarının belirtilmesi gerekmez.

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. DEFAULT ve NULL değerleriyle birden çok satır ekleme

Aşağıdaki örnek, tabloya satır eklemek için tablo değeri oluşturucuyu ve kullanırken belirtmeyi DEFAULTNULL gösterir.

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. FROM yan tümcesinde türetilmiş tablo olarak birden çok değer belirtme

Aşağıdaki örneklerde, bir FROM deyiminin yan tümcesinde SELECT birden çok değer belirtmek için tablo değeri oluşturucu kullanılır.

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. MERGE deyiminde türetilmiş kaynak tablo olarak birden çok değer belirtme

Aşağıdaki örnek, satırları güncelleştirerek veya ekleyerek tabloyu değiştirmek MERGE için kullanırSalesReason. Kaynak tablodaki değeri NewName hedef tablonun ()Name sütunundaki SalesReason bir değerle eşleştiğinde, ReasonType sütun hedef tabloda güncelleştirilir. değeri NewName eşleşmediğinde, kaynak satır hedef tabloya eklenir. Kaynak tablo, kaynak tablo için birden çok satır belirtmek üzere Transact-SQL tablo değeri oluşturucuyu kullanan türetilmiş bir tablodur.

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. 1.000'den fazla satır ekleme

Aşağıdaki örnek, türetilmiş bir tablo olarak tablo değeri oluşturucusunun kullanılmasını gösterir. Bu, tek bir tablo değeri oluşturucusundan 1.000'den fazla satır eklemeye olanak tanır.

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

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