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

Bir tablo haline getirilecek bir grup satır değeri ifadeleri belirtir. Transact-SQL tablo değer oluşturucusu, tek bir DML deyiminde birden çok veri satırının belirtilmesine izin verir. Tablo değer oluşturucusu INSERT deyiminin VALUES yan tümcesinde, MERGE deyiminin USING <kaynak tablo> yan tümcesinde ve FROM yan tümcesindeki bir türetilmiş tablo tanımında belirtilebilir.

Konu bağlantısı simgesi Transact-SQL Sözdizim Kuralları

Sözdizimi

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

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

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

Bağımsız değişkenler

  • VALUES
    Satır değeri ifadesi listelerini tanıtır. Her listenin parantez içine alınması ve virgülle ayrılması gerekir

    Her listede belirtilen değerlerin sayısı aynı 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 girilen her değerin sütununu belirtmelidir.

  • DEFAULT
    Veritabanı Altyapısı'yi sütun için tanımlanmış varsayılan değeri eklemeye zorlar. Sütunun varsayılan bir değeri yoksa ve sütun null değerlere izin veriyorsa, NULL girilir. DEFAULT değeri kimlik sütunu için geçerli değildir. Bir tablo değer oluşturucusunda belirtildiğinde, DEFAULT yalnızca INSERT deyiminde kullanılabilir.

  • expression
    Sabit bir değer, bir değişken veya bir ifadedir. İfade bir EXECUTE deyimi içeremez.

Sınırlamalar ve Kısıtlamalar

Tablo değer oluşturucusu kullanılarak oluşturulabilecek en yüksek satır sayısı 1000'dir. 1000'den fazla satır eklemek için, birden fazla INSERT deyimi oluşturun veya bcp yardımcı programını veya BULK INSERT deyimini kullanarak verileri topluca içe aktarın.

Satır değeri ifadesi olarak yalnızca tek skaler değerler kullanılabilir. Birden çok sütun içeren bir alt sorgu bir satır değeri ifadesi olarak kullanılamaz. Örneğin, aşağıdaki kod, üçüncü satır değeri ifade listesi birden çok sütunlu bir alt sorgu içerdiğinden bir sözdizimi hatasıyla sonuçlanır.

USE AdventureWorks2012;
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 deyim, alt sorgudaki her sütun ayrı ayrı belirtilerek yeniden yazılabilir. Aşağıdaki örnek MyProducts tablosuna üç satırı başarıyla eklemektedir.

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ı bir INSERT deyiminde belirtilen değerler UNION ALL sözdiziminin veri türü dönüştürme özelliklerine uyar. Bu, eşleşmeyen türlerin örtülü olarak daha yüksek öncelikli türe dönüştürülmesiyle sonuçlanır. Dönüştürme desteklenen bir örtülü 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 bir karakter değeri eklemektedir.

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

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, SQL Server, veri türü önceliği bir tamsayının bir karakterden daha yüksek bir tür olduğunu gösterdiği için 'a' harfini bir 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. Kuralları açıkça gerektiği gibi dönüştürerek bu hatadan kaçınabilirsiniz. Örneğin, önceki deyim aşağıdaki gibi yazılabilir.

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

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

Örnekler

A.Birden çok satır veri ekleme

Aşağıdaki örnek dbo.Departments tablosunu oluşturmakta, sonra tabloya beş satır veri girmek için tablo veri oluşturucusunu kullanmaktadır. Tüm sütunların değerleri sağlandığından ve değerler tablodaki sütunlarla aynı sırada listelendiklerinden, sütun adlarının sütun listesinde belirtilmesi gerekmez.

USE AdventureWorks2012;
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ğerlerle birden çok satır ekleme

Aşağıdaki örnek, bir tabloya satır eklemek için tablo değer oluşturucusu kullanılırken DEFAULT ve NULL belirtmeyi göstermektedir.

USE AdventureWorks2012;
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.Bir FROM yan tümcesinde birden fazla değeri türetilmiş bir tablo olarak belirtme

Aşağıdaki örnek, bir SELECT deyiminin FROM deyiminde birden fazla değer belirtmek için tablo değer oluşturucusunu kullanmaktadır.

SELECT a, b FROM (VALUES (1, 2), (3, 4), (5, 6), (7, 8), (9, 10) ) AS MyTable(a, b);
GO

SELECT a, b FROM (VALUES (1, 2), (3, 4), (5, 6), (7, 8), (9, 10) ) AS MyTable(a, b);
GO

D.Bir MERGE yan tümcesinde birden fazla değeri türetilmiş bir kaynak tablo olarak belirtme

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

USE AdventureWorks2012;
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;

Ayrıca bkz.

Başvuru

Insert (Transact-sql)

BİRLEŞTİRME (Transact-sql)

FROM (Transact-sql)