共用方式為


實作使用者自訂類型

本主題將說明如何在 SQL Server 中建立並卸除 Common Language Runtime (CLR) 使用者自訂類型。

建立使用者自訂類型

若要在 SQL Server 中建立使用者自訂類型,必須依序執行下列步驟:

  • 以 Microsoft.NET Framework 支援的語言,將使用者自訂類型定義為類別或結構。如需有關如何在 CLR 中程式設計類型的詳細資訊,請參閱<CLR 使用者定義型別>。然後,請使用適當語言編譯器,在 .NET Framework 中編譯類別或結構,以建立組件。

  • 使用 CREATE ASSEMBLY 陳述式在 SQL Server 中登錄組件。如需有關 SQL Server 中組件的詳細資訊,請參閱<組件 (Database Engine)>。

  • 建立參考已註冊組件之類型。

[!附註]

在 MicrosoftVisual Studio 中部署 SQL Server 專案,會在已指定給專案的資料庫中註冊組件。部署專案時,也會在資料庫中為所有以 SqlUserDefinedType 屬性註解的類別定義建立 CLR 使用者自訂類型。如需詳細資訊,請參閱<部署 CLR 資料庫物件>。

[!附註]

依預設,SQL Server 執行 CLR 程式碼的功能是設為 OFF。您可以建立、修改及卸除參考 Managed 程式碼模組的資料庫物件,但除非您利用 sp_configure 來啟用 clr enabled 選項,否則,這些參考就不會在 SQL Server 中執行。

若要建立、修改或卸除組件

若要建立使用者自訂類型

卸除使用者自訂類型

若要卸除使用者自訂類型

[!附註]

當使用者自訂類型建立之後,便不可修改,因為變更會使得資料表或索引中的資料失效。若要修改類型,您必須先卸除類型再重新建立,或是使用 WITH UNCHECKED DATA 子句發出 ALTER ASSEMBLY 陳述式。

您要等到使用者自訂類型的所有參考都移除後,才能卸除使用者自訂類型。這些參考包括:

  • 在該類型上定義的資料行。

  • 運算式參考該類型的計算資料行以及 CHECK 條件約束。

  • 運算式定義參考該類型的結構描述繫結檢視和函數。

  • 函數和預存程序的參數。

若要找出與使用者自訂類型相依的資料行

下列範例會擷取在使用者自訂類型 ComplexNumber 上定義之資料行的相關中繼資料。

SELECT * FROM sys.columns 
WHERE user_type_id = TYPE_ID('ComplexNumber');

下列範例會為最低權限使用者擷取在使用者自訂類型 ComplexNumber 上定義之資料行的相關有限中繼資料。

SELECT * FROM sys.column_type_usages 
WHERE user_type_id = TYPE_ID('ComplexNumber');

找出與使用者定義型別相依的計算資料行運算式、CHECK 條件約束運算式和模組運算式

下列範例會擷取與使用者定義型別 SimpleUdt 具有相依性之計算資料行 (及其資料表) 的名稱。

SELECT OBJECT_SCHEMA_NAME (referencing_id) AS referencing_schema_name,
    OBJECT_NAME(referencing_id) AS referencing_name,
    COL_NAME(referencing_id, referencing_minor_id) AS column_name,
    is_caller_dependent,
    is_ambiguous
FROM sys.sql_expression_dependencies
WHERE referenced_id = TYPE_ID('SimpleUdt')
    AND referenced_class = 6 
    AND OBJECTPROPERTY(referencing_id, 'IsTable')=1; 

下列範例會擷取與使用者定義型別 SimpleUdt 具有相依性之 CHECK 條件約束 (以及其定義所在之物件) 的名稱。

SELECT SCHEMA_NAME(o.schema_id) AS schema_name,
    OBJECT_NAME(o.parent_object_id) AS table_name,
    OBJECT_NAME(o.object_id) AS constraint_name
FROM sys.sql_expression_dependencies AS d
JOIN sys.objects AS o
ON o.object_id = d.referencing_id
WHERE referenced_id = TYPE_ID('SimpleUdt')
AND referenced_class = 6 
AND OBJECTPROPERTY(o.object_id, 'IsCheckCnst')=1;

下列範例會擷取模組的名稱,這些模組的定義會參考使用者定義型別 SimpleUdt。

USE AdventureWorks;
GO
SELECT referencing_schema_name, referencing_entity_name, referencing_id, referencing_class_desc, is_caller_dependent
FROM sys.dm_sql_referencing_entities ('SimpleUdt', 'TYPE');
GO

若要找出與使用者自訂類型相依的參數

下列範例會擷取在使用者自訂類型 ComplexNumber 上定義之參數 (及它們所屬的物件) 的名稱。

SELECT OBJECT_NAME(object_id) AS object_name,
    NULL AS procedure_number,
    name AS param_name,
    parameter_id AS param_num,
    TYPE_NAME(p.user_type_id) AS type_name
FROM sys.parameters AS p
WHERE p.user_type_id = TYPE_ID('ComplexNumber')
ORDER BY object_name, procedure_number, param_num;

下列範例會為最低權限使用者擷取在使用者自訂類型 ComplexNumber 上定義之參數的相關有限中繼資料。

SELECT * FROM sys.parameter_type_usages 
WHERE user_type_id = TYPE_ID('ComplexNumber');