Aracılığıyla paylaş


Tablo (Transact-SQL)

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

tablo, daha sonra işlenmek üzere bir sonuç kümesini depolamak için kullanılan özel bir veri türüdür. tablo öncelikle tablo değerli işlev sonuç kümesi olarak döndürülen bir satır kümesini geçici olarak depolamak için kullanılır. İşlevler ve değişkenlertablo türünde olarak bildirilebilir. tablo değişkenleri işlevlerde, saklı yordamlarda ve toplu işlemlerde kullanılabilir. tablo türünde değişkenleri bildirmek için kullanın.

Transact-SQL söz dizimi kuralları

Syntax

table_type_definition ::=
    TABLE ( { <column_definition> | <table_constraint> } [ , ...n ] )

<column_definition> ::=
    column_name scalar_data_type
    [ COLLATE <collation_definition> ]
    [ [ DEFAULT constant_expression ] | IDENTITY [ ( seed , increment ) ] ]
    [ ROWGUIDCOL ]
    [ column_constraint ] [ ...n ]

 <column_constraint> ::=
    { [ NULL | NOT NULL ]
    | [ PRIMARY KEY | UNIQUE ]
    | CHECK ( logical_expression )
    }

<table_constraint> ::=
     { { PRIMARY KEY | UNIQUE } ( column_name [ , ...n ] )
     | CHECK ( logical_expression )
     }

Arguments

table_type_definition

CREATE TABLE'da tablo tanımlamak için kullanılan bilgilerin aynı alt kümesi. Tablo bildirimi sütun tanımlarını, adları, veri türlerini ve kısıtlamaları içerir. İzin verilen tek kısıtlama türleri BİRİnCİl ANAHTAR, BENZERSİz ANAHTAR ve NULL'tır.

Söz dizimi hakkında daha fazla bilgi için bkz. CREATE TABLE (Transact-SQL), CREATE FUNCTION (Transact-SQL)ve .

collation_definition

Microsoft Windows yerel ayarından ve karşılaştırma stilinden, Windows yerel ayarından ve ikili gösteriminden veya Microsoft SQL Server harmanlamadan oluşan sütunun harmanlaması. collation_definition belirtilmezse, sütun geçerli veritabanının harmanlamasını devralır. Ya da sütun ortak dil çalışma zamanı (CLR) kullanıcı tanımlı tür olarak tanımlanmışsa, sütun kullanıcı tanımlı türün harmanlamasını devralır.

Remarks

tablo, aşağıdaki örnekte gösterildiği gibi bir toplu iş from yan tümcesindeki Başvuru değişkenlerine ada göre başvuru:

SELECT Employee_ID, Department_ID FROM @MyTableVar;

FROM yan tümcesi dışında, aşağıdaki örnekte gösterildiği gibi tablo değişkenlerine bir diğer ad kullanılarak başvurulmalıdır:

SELECT EmployeeID,
    DepartmentID
FROM @MyTableVar m
INNER JOIN Employee
    ON m.EmployeeID = Employee.EmployeeID
    AND m.DepartmentID = Employee.DepartmentID;

tablo değişkenleri, değişmeyen sorgu planları olan küçük ölçekli sorgular ve yeniden derleme endişeleri baskın olduğunda geçici tablolara göre aşağıdaki avantajları sağlar:

  • tablo değişkeni yerel değişken gibi davranır. İyi tanımlanmış bir kapsama sahiptir. Bu değişken, bildirildiği işlevde, saklı yordamda veya toplu işte kullanılabilir.

    Kapsamında, tablo değişkeni normal bir tablo gibi kullanılabilir. SELECT, INSERT, UPDATE ve DELETE deyimlerinde bir tablo veya tablo ifadesinin kullanıldığı her yere uygulanabilir. Ancak, tablo aşağıdaki deyimde kullanılamaz:

SELECT select_list INTO table_variable;

tablo değişkenleri tanımlandığı işlevin, saklı yordamın veya toplu işlemin sonunda otomatik olarak temizlenir.

  • saklı yordamlarda kullanılan tablo değişkenleri , performansı etkileyen maliyet tabanlı seçenekler olmadığında geçici tabloların kullanılmasına kıyasla daha az saklı yordam yeniden derlemesine neden olur.

    Tablo değişkenleri, bunları oluşturan toplu iş için tamamen yalıtılır, bu nedenle geçici bir tabloyla gerçekleşebilecek create veya ALTER deyimi gerçekleştiğinde yeniden çözümleme oluşması gerekmez. Geçici tablolar, tabloya iç içe bir saklı yordamdan başvurulabilmesi için bu yeniden çözüme ihtiyaç duyar. Tablo değişkenleri bu adımı tamamen önler, bu nedenle saklı yordamlar önceden derlenmiş planı kullanabilir ve bu nedenle saklı yordamı işlemek için kaynakları kaydedebilir.

  • tablo değişkenlerini içeren işlemler yalnızca tablo değişkendeki güncelleştirme süresi boyunca sürer. Bu nedenle, tablo değişkenleri daha az kilitleme ve günlüğe kaydetme kaynağı gerektirir.

Sınırlamalar ve kısıtlamalar

tablo değişkenlerinde dağıtım istatistikleri yoktur. Yeniden derlemeleri tetiklemez. Çoğu durumda iyileştirici, tablo değişkeninde satır olmadığı varsayımı üzerine bir sorgu planı oluşturur. Bu nedenle, daha fazla sayıda satır (100'den büyük) bekliyorsanız tablo değişkeni kullanma konusunda dikkatli olmanız gerekir. Geçici tablolar bu durumda daha iyi bir çözüm olabilir. Tablo değişkenini diğer tablolarla birleştiren sorgular için, iyileştiricinin tablo değişkeni için doğru kardinaliteyi kullanmasına neden olan RECOMPILE ipucunu kullanın.

tablo değişkenleri SQL Server iyileştiricisinin maliyet tabanlı akıl yürütme modelinde desteklenmez. Bu nedenle, verimli bir sorgu planı elde etmek için maliyet tabanlı seçimler gerektiğinde kullanılmamalıdır. Maliyet tabanlı seçimler gerektiğinde geçici tablolar tercih edilir. Bu plan genellikle birleşimler, paralellik kararları ve dizin seçimi seçimleri içeren sorguları içerir.

tablo değişkenlerini değiştiren sorgular paralel sorgu yürütme planları oluşturmaz. Karmaşık sorgulardaki büyük tablo değişkenleri veya tablo değişkenleri değiştirildiğinde performans etkilenebilir. tablo değişkenlerinin değiştirildiği durumlarda bunun yerine geçici tablolar kullanmayı göz önünde bulundurun. Daha fazla bilgi için bkz. CREATE TABLE (Transact-SQL). tablo değişkenlerini değiştirmeden okuyan sorgular paralel hale getirilebilir.

Important

Veritabanı uyumluluk düzeyi 150, tablo değişkeni ertelenen derlemekullanıma sunulmasıyla tablo değişkenlerinin performansını artırır. Daha fazla bilgi için bkz. Tablo değişkeni ertelenen derleme.

Dizinler tablo değişkenlerinde açıkça oluşturulamaz ve tablo değişkenlerinde hiçbir istatistik tutulmaz. SQL Server 2014(12.x) ile başlayarak, tablo tanımıyla satır içinde belirli dizin türleri oluşturmanıza olanak tanıyan yeni söz dizimi kullanıma sunulmuştur. Bu yeni söz dizimini kullanarak, tablo tanımının bir parçası olarak tablo değişkenlerinde dizinler oluşturabilirsiniz. Bazı durumlarda performans, tam dizin desteği ve istatistikler sağlayan geçici tablolar kullanılarak geliştirilebilir. Geçici tablolar ve satır içi dizin oluşturma hakkında daha fazla bilgi için bkz. create TABLE (Transact-SQL).

tablosundaki denetim kısıtlamaları, VARSAYıLAN değerler ve hesaplanan sütunlar tür bildirimi kullanıcı tanımlı işlevleri çağıramaz. tablo değişkenleri arasındaki atama işlemi desteklenmez. tablo değişkenleri sınırlı kapsama sahip olduğundan ve kalıcı veritabanının parçası olmadığından işlem geri alma işlemleri bunları etkilemez. Tablo değişkenleri oluşturulduktan sonra değiştirilemez.

Tablo değişkenleri bir INTO deyiminde SELECT ... INTO yan tümcesinin hedefi olarak kullanılamaz.

Tablo değişkeni EXEC deyiminin veya sp_executesql saklı yordamın dışında oluşturulduysa, tablo değişkenine başvuran dinamik bir SQL Server sorgusu çalıştırmak için EXEC deyimini veya sp_executesql saklı yordamı kullanamazsınız. Tablo değişkenlerine yalnızca yerel kapsamlarında başvurulabildiğinden, bir EXEC deyimi ve sp_executesql saklı yordam tablo değişkeninin kapsamı dışında olacaktır. Bununla birlikte, tablo değişkenini oluşturabilir ve EXEC deyimi veya sp_executesql saklı yordamın içinde tüm işlemleri gerçekleştirebilirsiniz çünkü tablo değişkenleri yerel kapsamı EXEC deyiminde veya sp_executesql saklı yordamındadır.

Tablo değişkeni yalnızca bellek yapısı değildir. Tablo değişkeni belleğe sığmayacak kadar çok veri barındırabileceğinden, verileri depolamak için diskte bir yere sahip olması gerekir. Tablo değişkenleri, geçici tablolara benzer şekilde tempdb veritabanında oluşturulur. Kullanılabilir bellek varsa, bellekte (veri önbelleği) hem tablo değişkenleri hem de geçici tablolar oluşturulur ve işlenir.

Tablo değişkenleri ile geçici tablolar karşılaştırması

Tablo değişkenleri ve geçici tablolar arasında seçim aşağıdaki faktörlere bağlıdır:

  • Tabloya eklenen satır sayısı.
  • Sorgunun kaydedildiği yeniden derleme sayısı.
  • Sorguların türü ve performans için dizinlere ve istatistiklere bağımlılığı.

Bazı durumlarda, yeniden derlemenin daha küçük birimlerde gerçekleşmesi için geçici tablolarla saklı yordamı daha küçük saklı yordamlara bölmek yararlı olur.

Genel olarak, önemli miktarda veri olması ve tablonun tekrar tekrar kullanılması dışında mümkün olduğunda tablo değişkenlerini kullanırsınız. Bu durumda, sorgu performansını artırmak için geçici tabloda dizinler oluşturabilirsiniz. Ancak, her senaryo farklı olabilir. Microsoft, tablo değişkenlerinin belirli bir sorgu veya saklı yordam için geçici tablolardan daha yararlı olup olmadığını test yapmanızı önerir.

Examples

A. Tablo türünde bir değişken bildirme

Aşağıdaki örnek, UPDATE deyiminin OUTPUT yan tümcesinde belirtilen değerleri depolayan bir tablo değişkeni oluşturur. SELECT değerlerini ve @MyTableVar tablosundaki güncelleştirme işleminin sonuçlarını döndüren iki Employee deyimi takip eder. INSERTED.ModifiedDate sütunundaki sonuçlar, ModifiedDate tablosundaki Employee sütunundaki değerlerden farklıdır. Bu farkın nedeni, AFTER UPDATE değerini geçerli tarihe güncelleştiren ModifiedDate tetikleyicisinin Employee tablosunda tanımlanmasıdır. Ancak, OUTPUT döndürülen sütunlar tetikleyiciler tetiklenmeden önce verileri yansıtır. Daha fazla bilgi için bkz. OUTPUT Yan Tümcesi (Transact-SQL).

USE AdventureWorks2022;
GO
DECLARE @MyTableVar TABLE (
    EmpID INT NOT NULL,
    OldVacationHours INT,
    NewVacationHours INT,
    ModifiedDate DATETIME
);

UPDATE TOP (10) HumanResources.Employee
SET VacationHours = VacationHours * 1.25
OUTPUT INSERTED.BusinessEntityID,
    DELETED.VacationHours,
    INSERTED.VacationHours,
    INSERTED.ModifiedDate
INTO @MyTableVar;

--Display the result set of the table variable.
SELECT EmpID,
    OldVacationHours,
    NewVacationHours,
    ModifiedDate
FROM @MyTableVar;
GO

--Display the result set of the table.
--Note that ModifiedDate reflects the value generated by an
--AFTER UPDATE trigger.
SELECT TOP (10) BusinessEntityID,
    VacationHours,
    ModifiedDate
FROM HumanResources.Employee;
GO

B. Satır içi tablo değerli işlev oluşturma

Aşağıdaki örnek, satır içi tablo değerli bir işlev döndürür. , ProductIDNameüç sütun ve mağazaya satılan her ürün için YTD Total olarak depoya göre yıl-bugüne toplamlarının toplamını döndürür.

USE AdventureWorks2022;
GO
IF OBJECT_ID (N'Sales.ufn_SalesByStore', N'IF') IS NOT NULL
    DROP FUNCTION Sales.ufn_SalesByStore;
GO
CREATE FUNCTION Sales.ufn_SalesByStore (@storeid int)
RETURNS TABLE
AS
RETURN
(
    SELECT P.ProductID,
        P.Name,
        SUM(SD.LineTotal) AS 'Total'
    FROM Production.Product AS P
    INNER JOIN Sales.SalesOrderDetail AS SD
        ON SD.ProductID = P.ProductID
    INNER JOIN Sales.SalesOrderHeader AS SH
        ON SH.SalesOrderID = SD.SalesOrderID
    INNER JOIN Sales.Customer AS C
        ON SH.CustomerID = C.CustomerID
    WHERE C.StoreID = @storeid
    GROUP BY P.ProductID,
        P.Name
);
GO

İşlevi çağırmak için bu sorguyu çalıştırın.

SELECT * FROM Sales.ufn_SalesByStore (602);

Ayrıca bakınız