Share via


使用和修改使用者自訂類型的執行個體

您可以用下列方式來使用使用者自訂類型:

  • 建立含有使用者自訂類型資料行的資料表

  • 插入和修改使用者自訂類型資料行值

  • 將使用者自訂類型當作變數或參數

建立含有使用者自訂類型資料行的資料表

您可以建立含有使用者自訂類型資料行的資料表,方法是提供資料行名稱並參考類型名稱。這種方式跟建立由系統資料類型或別名資料型別所組成的資料行類似。若要建立 Common Language Runtime (CLR) 使用者自訂類型的資料行,您必須具有該類型的 REFERENCES 權限。

若要建立含有使用者自訂類型資料行的資料表

插入和修改使用者自訂類型資料行值

您可以插入與修改資料行值,並且變更使用者自訂類型的變數或參數值。

[!附註]

使用者自訂類型在建立之後,就無法修改,因為任何這類變更可能會使資料表或索引的資料無效。若要修改類型,您必須先卸除類型再重新建立,或是使用 WITH UNCHECKED DATA 子句發出 ALTER ASSEMBLY 陳述式。如需詳細資訊,請參閱<ALTER ASSEMBLY (Transact-SQL)>。

您可以執行下列動作,來插入或修改使用者自訂類型資料行值:

  • 只要使用者自訂類型支援從這個類型進行隱含或明確的轉換,便在 SQL Server 系統資料類型中提供一個值。下列範例會顯示如何從字串進行明確的轉換,以便在使用者自訂類型 Point 的資料行中更新值:

    UPDATE Cities
    SET Location = CONVERT(Point, '12.3:46.2')
    WHERE Name = 'Anchorage'
    
  • 叫用使用者自訂類型標示為 mutator 的方法來執行更新。下面的範例會叫用類型為 point、名稱為 SetXY 的 Mutator 方法,來更新該類型執行個體的狀態:

    UPDATE Cities
    SET Location.SetXY(23.5, 23.5)
    WHERE Name = 'Anchorage'
    

    [!附註]

    如果在 Transact-SQL Null 值上呼叫了 mutator 方法,或是 mutator 方法所產生的新值是 Null,SQL Server 就會傳回錯誤。

  • 修改使用者自訂類型的屬性值或公用欄位值。提供這個值的運算式必須可隱含轉換成該屬性的類型。下列範例會修改使用者自訂類型 point 的 X 屬性值:

    UPDATE Cities
    SET Location.X = 23.5
    WHERE Name = 'Anchorage'
    

    若要修改相同使用者自訂類型的不同屬性,請發出多個 UPDATE 陳述式,或叫用該類型的 mutator 方法。

下列範例會在資料表中插入類型為 Point 的值:

INSERT INTO Cities (Name, Location)
VALUES ('Anchorage', CONVERT(Point, '23.5, 23.5'))

若要在資料表或檢視中插入使用者自訂類型的值

UPDATE (Transact-SQL)

將使用者自訂類型當作變數或參數

您可以將 Transact-SQL 變數,或是 Transact-SQL 或 Microsoft.NET Framework 函數或程序的參數,宣告為使用者自訂類型。適用的規則如下:

  • 您必須具有該類型的 EXECUTE 權限。

  • 如果您使用結構描述繫結來建立包含使用者自訂類型宣告的函數、預存程序或觸發程序,則必須具有該類型的 REFERENCES 權限。

如果您使用一個部份名稱,則 SQL Server 會以下列順序查詢類型參考:

  1. 目前資料庫中目前使用者的結構描述。

  2. 目前資料庫中 dbo 的結構描述。

  3. 系統的原生類型空間。

若要將使用者自訂類型宣告為函數或程序的 Transact-SQL 變數或參數

使用者自訂類型的使用限制

建立與使用使用者自訂類型時,請考慮下列情況:

  • 在 SQL Server 中建立使用者自訂類型時,不能定義長度、小數位數、有效位數或其他中繼資料。

  • 資料行、變數或參數不可宣告為已在其他資料庫中定義的使用者自訂類型。如需詳細資訊,請參閱<跨資料庫使用使用者自訂類型>。

  • 若要判斷使用者自訂類型是否與先前定義的相同,請不要比較類型識別碼,因為這個識別碼只在使用者自訂類型的存留時間有效,而且可能已經被回收。請改為比較 CLR 類型名稱、四個部份組件名稱,以及組件位元組。

  • sql_variant 資料行不可包含使用者自訂類型的執行個體。

  • 使用者自訂類型不可作為 CLR 程序、CLR 函數、CLR 觸發程序或資料分割函數中的預設值。

  • 使用者自訂類型不可在 table 變數的計算資料行中參考。