資料表 (Transact-SQL)

這是可用來儲存結果集以便稍後進行處理的特殊資料類型。table 主要用於暫存儲存當做資料表值函數結果集傳回的一組資料列。

[!附註]

若要宣告 table 類型的變數,請使用 DECLARE @local_variable

主題連結圖示Transact-SQL 語法慣例

語法


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

引數

  • table_type_definition
    這是在 CREATE TABLE 中,用來定義資料表的相同資訊子集。資料表宣告包括資料行定義、名稱、資料類型和條件約束。允許使用的條件約束類型只有 PRIMARY KEY、UNIQUE KEY 和 NULL。

    如需有關語法的詳細資訊,請參閱<CREATE TABLE (Transact-SQL)>、<CREATE FUNCTION (Transact-SQL)>和<DECLARE @local\_variable (Transact-SQL)>。

  • collation_definition
    這是 Microsoft Windows 地區設定和比較樣式、Windows 地區設定和二進位標記法所組成之資料行的定序,或 MicrosoftSQL Server 定序。若未指定 collation_definition,資料行就會繼承目前資料庫的定序。或者,如果將資料行定義為 Common Language Runtime (CLR) 使用者定義型別,資料行便會繼承使用者定義型別的定序。

備註

函數和變數可以宣告成 table 類型。在函數、預存程序和批次中,可以使用 table 變數。

重要注意事項重要事項

修改 table 變數的查詢不會產生平行查詢執行計畫。修改非常大的 table 變數或複雜查詢中的 table 變數時,可能會影響效能。在這些狀況中,請改用暫存資料表。如需詳細資訊,請參閱<CREATE TABLE (Transact-SQL)>。讀取但不修改 table 變數的查詢仍然可以平行處理。

table 變數的優點如下:

  • table 變數的行為類似於本機變數。它有一個定義妥善的範圍。這是其宣告所在的函數、預存程序或批次。

    在 table 變數的範圍內,您可以依照正規資料表的方式來使用它。在 SELECT、INSERT、UPDATE 和 DELETE 陳述式中,任何使用資料表或資料表運算式的位置,都可以使用它。不過,在下列陳述式中,不能使用 table:

    SELECT select_list INTO table_variable   
    

    在定義 table 變數的函數、預存程序或批次結束時,會自動清除這些變數。

  • table 類型宣告中的 CHECK 條件約束、DEFAULT 值和計算資料行,無法呼叫使用者定義函數。

  • 預存程序中使用的 table 變數所造成的預存程序重新編譯,比使用暫存資料表時還少。

  • 包含 table 變數的交易,只會在 table 變數更新期間持續存在。因此,table 變數比較不需要鎖定和記錄資源。

您無法明確建立 table 變數的索引,也無法保留 table 變數的任何統計資料。在某些情況下,改用支援索引和統計資料的暫存資料表可以改進效能。如需有關暫存資料表的詳細資訊,請參閱<CREATE TABLE (Transact-SQL)>。

批次之 FROM 子句中的名稱可以參考 table 變數,如以下範例所示:

SELECT Employee_ID, Department_ID FROM @MyTableVar

在 FROM 子句之外,您必須依照下列範例所示,利用別名來參考 table 變數:

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

不支援 table 變數之間的指派作業。另外,由於 table 變數的範圍受到限制,且不是保存資料庫的一部分,因此,它們不會受交易回復的影響。