Tablo (Transact-sql)

Sonucu depolamak için kullanılan özel veri türü, daha sonra işlenmek üzere ayarlanır. tableöncelikle bir tablo değerli işlev sonuç kümesi olarak döndürülen satır kümesi geçici depolama için kullanılır. Tür için işlevler ve değişkenler bildirilebilir table. tabledeğişkenler, İşlevler, saklı yordamlar ve toplu işlemi kullanılabilir. Türü değişkenleri bildirmek için tablekullanmak declare @ local_variable.

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

Sözdizimi


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 ) 
     } 

Bağımsız değişkenler

  • table_type_definition
    Bir tablo oluşturmak tablo tanımlamak için kullanılan bilgileri aynı alt kümesidir. Tablo bildirimi sütun tanımlarını, adları, veri türlerini ve kısıtlamaları içerir. İzin verilen tek kısıtlama birincil anahtar ve benzersiz anahtar null türleridir.

    Sözdizimi hakkında daha fazla bilgi için bkz: Tablo (Transact-sql) oluştur, CREATE FUNCTION (Transact-SQL), ve DECLARE @local\_variable (Transact-SQL).

  • collation_definition
    Oluşan sütunun harmanlama olup bir MicrosoftWindows yerel ve karşılaştırma stili, Windows yerel ayar ve ikili gösterimde, ya da bir Microsoft  SQL Serverharmanlama. Eğer collation_definitionbelirtilmemiş sütun geçerli veritabanı harmanlama devralır. Veya sütun sütun bir ortak dil çalışma zamanı (clr) kullanıcı tanımlı türü tanımlanmışsa, kullanıcı tanımlı türü harmanlama devralır.

En İyi Yöntemler

Tablo değişkenlerini, büyük miktarda veriyi (100'den fazla satır) depolamak için kullanmayın. Büyük miktarda veri içeren bir tablo değişkeni planı seçenekleri en iyi ya da kararlı olmayabilir. Geçici tablolar kullanın ya da Doktoru emin olmak için use plan sorgu ipucu kullanma gibi sorguları yeniden çalışır, varolan bir sorgu planı iyi senaryo için kullandığı düşünün.

Genel Yorumlar

table değişkenler aşağıdaki örnekte gösterildiği gibi from yan tümcesinde bir toplu adıyla başvurulabilir:

SELECT Employee_ID, Department_ID FROM @MyTableVar;

SELECT Employee_ID, Department_ID FROM @MyTableVar;

Dışındaki bir from yan tümcesi, tabledeğişkenler gerekir başvurulan bir takma ad kullanarak aşağıdaki örnekte gösterildiği gibi:

SELECT EmployeeID, DepartmentID 
FROM @MyTableVar m
JOIN Employee on (m.EmployeeID =Employee.EmployeeID AND
   m.DepartmentID = Employee.DepartmentID);

SELECT EmployeeID, DepartmentID 
FROM @MyTableVar m
JOIN Employee on (m.EmployeeID =Employee.EmployeeID AND
   m.DepartmentID = Employee.DepartmentID);

tabledeğişkenler, değişmez ve derlenmesini endişeleri egemen olduğunda sorgu planları var. küçük ölçekli sorgular için aşağıdaki yararları sağlar:

  • A tabledeğişkeni yerel bir değişken gibi davranır. İyi tanımlanmış bir kapsama sahiptir. Bu işlev, saklı yordam veya içinde bildirildiği toplu olduğunu.

    Kapsam içinde bir tablegibi normal bir tablo değişkeni kullanılabilir. Bir tablo veya tablo ifade select, INSERT, update ve delete deyimlerinde kullanılan her yerde uygulanabilir. Ancak, tableşu deyimi kullanılamaz:

    SELECT select_list INTO table_variable;
    
    SELECT select_list INTO table_variable;
    

    tabledeğişkenler işlev, saklı yordam veya toplu iş içinde tanımlandıkları sonunda otomatik olarak temizlenir.

  • tablesaklı yordamlarda kullanılan değişkenler performansı etkileyen maliyet tabanlı seçenek varken, geçici tablolara kullanıldığında daha az sayıda derlemelerinde saklı yordamlar neden.

  • Maddelerle ilgili hareketlerin tabledeğişkenler üzerinde yalnızca bir güncelleştirme süresi için son tabledeğişkeni. Bu nedenle, tabledeğişkenleri gerektiren az kilitleme ve kaynak günlüğü.

Sınırlamalar ve Kısıtlamalar

tabledeğişkenleri desteklenmez SQL ServerDoktoru'nın maliyet temelinde mantık modeli. Etkin sorgu planı elde etmek için maliyet tabanlı seçenek gerektiğinde bu nedenle onlar kullanılmamalıdır. Geçici tablolara, maliyet tabanlı seçenek gerekli olduğunda tercih edilir. Bu genellikle birleşimler, paralellik kararları ve dizin seçimi seçenekleri ile sorgular içerir.

Değiştiren sorgular tabledeğişkenleri paralel sorgu yürütme planları oluşturmak değil. Performans etkilenen çok büyük tabledeğişkenleri veya tablekarmaşık sorgular, değişkenleri güncellenmiştir. Bu durumda, geçici tablolar kullanmayı düşünün. Daha fazla bilgi için, bkz. Tablo (Transact-sql) oluştur. Sorguları okumak tableolmadan onları değiştirmek variables-hala parallelized.

Dizinler üzerinde açıkça oluşturulamıyor tabledeğişkenleri ve hiçbir istatistikleri tutulur tabledeğişkenleri. Bazı durumlarda performansı geçici tablolara yerine kullanarak hangi dizinleri ve istatistik desteği artırabilir. Geçici tablolar hakkında daha fazla bilgi için bkz: Tablo (Transact-sql) oluştur.

KONTROL kısıtlamaları, varsayılan değerler ve hesaplanan sütunlarda tabletürü bildirimi cant arama kullanıcı tanımlı işlevler.

Atama işlemi arasında tabledeğişkenleri desteklenmiyor.

Çünkü tabledeğişkenleri kapsam sınırlı ve kalıcı veritabanı parçası olmayan, hareket al tarafından etkilenmez.

Örnekler

A.Tablo türünde bir değişken tanıtma

Aşağıdaki örnek bir tableupdate deyimi output yan tümcesinde belirtilen değerleri saklayan değişkeni. Ardından, değerleri @MyTableVar değişkeninde döndüren ve güncelleştirme işleminin sonuçlarını Employee tablosunda toplayan iki SELECT deyimi gelmektedir. INSERTED.ModifiedDate sütunundaki sonuçların Employee tablosundaki ModifiedDate sütunundaki değerlerden farklı olduğuna dikkat edin. Bunun nedeni, Employee tablosunda, ModifiedDate değerini geçerli tarihle güncelleştiren AFTER UPDATE tetikleyicisinin tanımlanmış olmasıdır. Ancak sütunları döndürülen OUTPUTtetikleyicileri harekete önce verileri yansıtacak. Daha fazla bilgi için, bkz. output Yantümcesi (Transact-sql).

USE AdventureWorks2012;
GO
DECLARE @MyTableVar table(
    EmpID int NOT NULL,
    OldVacationHours int,
    NewVacationHours int,
    ModifiedDate datetime);
UPDATE TOP (10) HumanResources.Employee
SET VacationHours = VacationHours * 1.25,
    ModifiedDate = GETDATE() 
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.
SELECT TOP (10) BusinessEntityID, VacationHours, ModifiedDate
FROM HumanResources.Employee;
GO

B.Tablo değerli satır içi bir işlev oluşturma

Aşağıdaki örnek, tablo değerli satır içi bir işlev döndürmektedir. Üç sütun döndürür ProductID, Nameve yıllık tarihi toplamları deposu olarak tarafından toplam YTD Total saklamak için satılan her ürün için.

USE AdventureWorks2012;
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 
    JOIN Sales.SalesOrderDetail AS SD ON SD.ProductID = P.ProductID
    JOIN Sales.SalesOrderHeader AS SH ON SH.SalesOrderID = SD.SalesOrderID
    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 bkz.

Başvuru

HARMANLAMA (Transact-sql)

CREATE FUNCTION (Transact-SQL)

Tablo (Transact-sql) oluştur

DECLARE @local\_variable (Transact-SQL)

Sorgu ipuçları (Transact-sql)

Kavramlar

Kullanıcı tanımlı işlevler

Tablo Valued Parametreler (veritabanı altyapısı) kullanma