實作使用者定義型別
本主題描述如何在 SQL Server 中建立並卸除 Common Language Runtime (CLR) 使用者定義型別。
建立使用者自訂類型
若要在 SQL Server 中建立使用者自訂類型,必須依序執行下列步驟:
以 Microsoft .NET Framework 支援的語言,將使用者自訂類型定義為類別或結構。如需有關如何在 CLR 中程式設計類型的詳細資訊,請參閱<CLR 可程式性範例>。 如需有關範例的詳細資訊,請參閱<安裝 SQL Server 範例和範例資料庫的考量>。然後,請使用適當語言編譯器,在 .NET Framework 中編譯類別或結構,以建立組件。
使用 CREATE ASSEMBLY 陳述式在 SQL Server 中登錄組件。如需有關 SQL Server 中組件的詳細資訊,請參閱<組件 (Database Engine)>。
建立參考已註冊組件之類型。
[!附註]
在 Microsoft Visual 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 AdventureWorks2008R2;
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');