共用方式為


CLR 整合 - 概觀

適用於:SQL Server Azure SQL 受控執行個體

做為 Microsoft .NET Framework 核心的 Common Language Runtime (CLR),提供了所有 .NET Framework 程式碼的執行環境。 CLR 中執行的程式碼稱為 Managed 程式碼。 CLR 提供程式執行所需的各種功能及服務,包括 just-in-time (JIT) 編譯、配置及管理記憶體、強制使用型別安全性、例外處理、執行緒管理及安全性。 如需詳細資訊,請參閱 .NET Framework SDK。

利用 Microsoft SQL Server 中裝載的 CLR (稱為 CLR 整合),您能夠以 Managed 程式碼撰寫預存程序、觸發程序、使用者定義函式、使用者定義型別及使用者定義彙總。 因為 Managed 程式碼在執行前會編譯成原生程式碼,所以在部分案例中可大幅提升效能。

Managed 程式代碼會使用程式代碼存取安全性 (CAS) 來防止元件執行特定作業。 SQL Server 使用 CAS 協助保護 Managed 程式碼,並防止損害作業系統或資料庫伺服器。

CLR 整合的優點 \(機器翻譯\)

Transact-SQL 專為資料庫中的直接數據存取和操作而設計。 雖然 Transact-SQL 擅長數據存取和管理,但這不是完整的程式設計語言。 例如,Transact-SQL 不支援陣列、集合、for-each 迴圈、位移位或類別。 雖然某些建構可以在 Transact-SQL 中模擬,但 Managed 程式代碼已整合這些建構的支援。 根據案例,這些功能可以提供在Managed程式碼中實作特定資料庫功能令人信服的理由。

Microsoft Visual Basic .NET 和 Microsoft Visual C# 提供面向物件功能,例如封裝、繼承和多型。 相關程式代碼現在可以輕鬆地組織成類別和命名空間。 當您使用大量的伺服器程式代碼時,這可讓您更輕鬆地組織和維護程序代碼。

Managed 程式代碼比 Transact-SQL 更適合用於計算和複雜的執行邏輯,而且具有許多複雜工作的廣泛支援,包括字串處理和正則表達式。 透過 .NET Framework 連結庫中找到的功能,您可以存取數千個預先建置的類別和例程。 您可以從任何預存程式、觸發程式或使用者定義函式輕鬆存取這些專案。 基類庫 (BCL) 包含提供字串操作、進階數學作業、檔案存取、密碼編譯等功能的類別。

注意

雖然這些類別中有許多可從 SQL Server 中的 CLR 程式代碼中使用,但不適用於伺服器端使用的類別(例如視窗類別),則無法使用。 如需詳細資訊,請參閱 支援的 .NET Framework 連結庫

Managed 程式代碼的優點之一是類型安全性,或保證程式代碼只會以定義完善的允許方式存取類型。 在執行 Managed 程式代碼之前,CLR 會驗證程式代碼是否安全。 例如,會檢查程式代碼,以確保沒有讀取先前未寫入的記憶體。 CLR 也可以協助確保程式碼不會操作 Unmanaged 記憶體。

CLR 整合提供改善效能的可能性。 如需詳細資訊,請參閱 CLR 整合的效能。

警告

CLR 使用 .NET Framework 中的程式碼存取安全性 (CAS),而這不再作為安全性界限受支援。 使用 PERMISSION_SET = SAFE 所建立的 CLR 組件可以存取外部系統資源、呼叫 Unmanaged 程式碼,以及取得系統管理員權限。 從 SQL Server 2017 (14.x) 開始,引進稱為 clr strict securitysp_configure 選項來增強 CLR 組件的安全性。 clr strict security 會依預設啟用,且將 SAFEEXTERNAL_ACCESS 組件視作已標記為 UNSAFE 一樣。 可以基於回溯相容性停用 clr strict security 選項,但不建議這麼做。 Microsoft 建議透過具有已獲授與 master 資料庫中 UNSAFE ASSEMBLY 權限之對應登入的憑證或非對稱金鑰簽署所有組件。 如需詳細資訊,請參閱 CLR 嚴格安全性

在 Transact-SQL 和 Managed 程式代碼之間選擇

撰寫預存程式、觸發程式和使用者定義函式時,您必須做出的一個決策是使用傳統 Transact-SQL,或是 Visual Basic .NET 或 Visual C# 等 .NET Framework 語言。 當程式代碼大部分會以很少或沒有程式邏輯執行數據存取時,請使用 Transact-SQL。 針對具有複雜邏輯的CPU密集函式和程式,或當您想要使用 .NET Framework 的 BCL 時,請使用 Managed 程式代碼。

選擇伺服器中的執行和用戶端中的執行

決定要使用 Transact-SQL 或 Managed 程式代碼的另一個因素是您希望程式代碼所在的位置、伺服器電腦或客戶端電腦。 Transact-SQL 和 Managed 程式代碼都可以在伺服器上執行。 這會將程式代碼和數據放在一起,並可讓您利用伺服器的處理能力。 另一方面,您可能想要避免將處理器密集型工作放在資料庫伺服器上。 現今大部分的用戶端電腦都非常強大,您可能想要盡可能將程式代碼放在用戶端上來利用此處理能力。 Managed 程式代碼可以在用戶端電腦上執行,而 Transact-SQL 則無法執行。

選擇擴充預存程式和Managed程式代碼

您可以建置擴充預存程式來執行 Transact-SQL 預存程式無法執行的功能。 不過,擴充預存程式可能會危害 SQL Server 進程的完整性,而驗證為類型安全的 Managed 程式代碼則無法。 此外,記憶體管理、線程和光纖的排程,以及同步處理服務在 CLR 和 SQL Server 的 Managed 程式代碼之間更深入整合。 透過 CLR 整合,您有比擴充預存程式更安全的方式,以撰寫您在 Transact-SQL 中無法執行工作所需的預存程式。 如需 CLR 整合和擴充預存程式的詳細資訊,請參閱 CLR 整合的效能。

另請參閱

安裝 .NET Framework
CLR 整合的架構
從 CLR 資料庫物件進行資料存取
開始使用 CLR 整合