CLR 統合の概要

CLR (共通言語ランタイム) は Microsoft .NET Framework の中核部分であり、あらゆる .NET Framework コードに対する実行環境を提供します。CLR 内で実行されるコードを、マネージ コードと呼びます。CLR では、JIT (Just-In-Time) コンパイル、メモリの割り当てと管理、タイプ セーフの確保、例外処理、スレッド管理、セキュリティなど、プログラムの実行に必要なさまざまな機能やサービスが提供されます。詳細については、.NET Framework SDK を参照してください。

Microsoft SQL Server でホストされる CLR のことを CLR 統合と呼びます。この CLR 統合を使用すると、マネージ コードで、ストアド プロシージャ、トリガー、ユーザー定義関数、ユーザー定義型、ユーザー定義集計を作成できます。マネージ コードは実行前にネイティブ コードにコンパイルされるので、シナリオによってはパフォーマンスの大幅な向上を図ることができます。

マネージ コードでは、アセンブリが特定の操作を実行できないように、CAS (コード アクセス セキュリティ) が使用されます。SQL Server では、CAS を使用して、マネージ コードをセキュリティで保護し、オペレーティング システムやデータベース サーバーが危険にさらされる状況を回避しています。

CLR 統合の利点

Transact-SQL は、データに直接アクセスしたり、データベースを直接操作することを主眼に設計されています。Transact-SQL はデータへのアクセスやデータの管理に優れていますが、いわゆる本格的なプログラミング言語ではありません。たとえば、Transact- SQL では、配列、コレクション、for-each ループ、ビット シフト、およびクラスはサポートされません。このような構成要素の一部は Transact-SQL を使用して類似したものを作成することもできますが、マネージ コードにはこれらの構成要素に対するサポートが組み込まれています。シナリオによっては、この特性が、特定のデータベースの機能をマネージ コードに実装するかどうかの決め手となることがあります。

Microsoft Visual Basic .NET と Microsoft Visual C# では、カプセル化、継承、多態性などオブジェクト指向の機能が提供されています。関連のあるコードは、簡単にクラスや名前空間に編成することができます。大量のサーバー コードを使用している場合も、この機能により、コードの編成と管理を簡略化できます。

計算や複雑な実行ロジックには、Transact-SQL よりもマネージ コードが適しています。また、マネージ コードでは、文字列処理や正規表現など、多数の複雑なタスクが幅広くサポートされています。.NET Framework ライブラリの機能を使用すると、数千もの事前にビルドされたクラスやルーチンにアクセスすることができます。このようなクラスやルーチンには、任意のストアド プロシージャ、トリガー、またはユーザー定義関数から簡単にアクセスできます。BCL (基本クラス ライブラリ) には、文字列操作、高度な算術演算、ファイル アクセス、暗号化などの機能を提供するクラスがあります。

注意

これらのクラスの多くは、SQL Server の CLR コード内から使用できますが、サーバー側での使用が適していないクラス (ウィンドウ関連のクラスなど) にはアクセスできません。詳細については、「サポートされている .NET Framework ライブラリ」を参照してください。

マネージ コードの利点の 1 つはタイプ セーフであることです。つまり、コードから各データ型へのアクセスは、正しく定義された許容される方法に限られます。CLR は、マネージ コードが実行される前に、そのコードが安全であることを確認します。たとえば、事前に書き込まれていないメモリからの読み取りが行われないように、コードがチェックされます。また、CLR は、コードからアンマネージ メモリの操作が行われないようにする際にも役立ちます。

CLR 統合を使用すると、パフォーマンスが向上する可能性が高くなります。詳細については、「CLR 統合のパフォーマンス」を参照してください。

Transact-SQL とマネージ コードの選択

ストアド プロシージャ、トリガー、およびユーザー定義関数を記述する際には、従来の Transact-SQL を使用するか、または Visual Basic .NET や Visual C# などの .NET Framework 言語を使用するかを判断する必要があります。データ アクセスに使用する手続き型のロジックが、コード中にない場合や非常に少ない場合は、Transact-SQL を使用します。複雑なロジックで CPU を集中的に使用する関数やプロシージャ、または .NET Framework の BCL を使用する場合は、マネージ コードを使用します。

サーバー側での実行とクライアント側での実行の選択

Transact-SQL とマネージ コードのどちらを使用するかを判断する際には、コードをサーバー コンピューターで実行するか、またはクライアント コンピューターで実行するかを判断する必要があります。Transact-SQL とマネージ コードは、どちらもサーバー側で実行することができます。サーバー側でコードを実行すると、コードとデータが近くにあるため、サーバーの処理能力を活用できます。逆に、データベース サーバーでプロセッサを集中的に使用するタスクを実行することが好ましくない場合もあります。現在、多くのクライアント コンピューターは高性能なので、できるだけ多くのコードをクライアント側で実行して、この処理能力を活用することもできます。Transact-SQL はクライアント側で実行することはできませんが、マネージ コードはクライアント側で実行することができます。

拡張ストアド プロシージャとマネージ コードの選択

Transact-SQL ストアド プロシージャでは実行不可能な機能を実行するために、拡張ストアド プロシージャを構築できます。ただし、拡張ストアド プロシージャでは、SQL Server プロセスの整合性を侵害する可能性があります。一方、マネージ コードは、タイプ セーフなので、SQL Server プロセスの整合性を侵害することはありません。さらに、CLR のマネージ コードと SQL Server の間では、メモリ管理、スレッドやファイバーのスケジュール設定、同期サービスが、より密接に統合されます。CLR 統合を使用すると、拡張ストアド プロシージャを使用するよりも安全に、Transact-SQL では記述できないタスクを実行するのに必要なストアド プロシージャを記述することができます。CLR 統合と拡張ストアド プロシージャの詳細については、「CLR 統合のパフォーマンス」を参照してください。