スポンサーサイト
CLR データベースオブジェクトについて
.NET Framework をサポートするプログラミング言語(VB.NET,C# など)が生成するマネージコードの実行処理を行うエンジンである CLR(Common Language Runtime)と SQL Server 2005 が統合されたことにより、データベースオブジェクトを .NET 言語でコーディングすることができます。
CLR 統合によるメリットの一部として、以下のことが考えられます。
個人的には、Transact-SQL では記述が複雑になりやすい時間計算用の「スカラ値 CLR 関数」など、用途を限定して利用していくことが有効な利用法の一つであると考えています。
CLR データベースオブジェクトの開発は、Visual Studio 2005 の「SQL Server プロジェクト」を利用して行うこともできますが、.NET Framework 2.0 の実行環境があれば手動でコンパイルできるため任意のテキストエディタで開発を行うことが可能です。
私自身が CLR データベースオブジェクトを利用する場合は、コーディングは開発効率を考えて Visual Studio 2005 で行い、ソースのコンパイルおよび SQL Server へのアセンブリの配置は本番環境への設定を考慮して手動で行っています。よって、本サイトでは上記の手順に沿って解説を行います。
CLR 統合によるメリットの一部として、以下のことが考えられます。
・ 配列やクラスなどの Transact-SQL にはない構造や機能を利用できる。
・ .NET Framework が提供する膨大なクラスを利用できる。
・ 文字列操作、暗号化などマネージコードが適している処理では、パフォーマンスの向上が図れる
しかし、利用方法を誤るとパフォーマンスや保守性の低下などが起こってしまう危険性も考えられます。特に保守性については、現在および将来におけるシステムやデータベースの保守担当者が苦しまないよう、十分に検討を行ってから CLR データベースオブジェクトを有効に活用する必要があると思います。・ .NET Framework が提供する膨大なクラスを利用できる。
・ 文字列操作、暗号化などマネージコードが適している処理では、パフォーマンスの向上が図れる
個人的には、Transact-SQL では記述が複雑になりやすい時間計算用の「スカラ値 CLR 関数」など、用途を限定して利用していくことが有効な利用法の一つであると考えています。
CLR データベースオブジェクトの開発は、Visual Studio 2005 の「SQL Server プロジェクト」を利用して行うこともできますが、.NET Framework 2.0 の実行環境があれば手動でコンパイルできるため任意のテキストエディタで開発を行うことが可能です。
私自身が CLR データベースオブジェクトを利用する場合は、コーディングは開発効率を考えて Visual Studio 2005 で行い、ソースのコンパイルおよび SQL Server へのアセンブリの配置は本番環境への設定を考慮して手動で行っています。よって、本サイトでは上記の手順に沿って解説を行います。
CLR データベースオブジェクトを利用可能にする設定
Microsoft SQL Server 2005 をインストールした直後の状態では、CLR データベースオブジェクトの実行が無効に設定されています。今回は、ユーザー定義関数、プロシージャ、トリガ、型などのCLR データベースオブジェクトを利用可能とするための設定方法を説明します。なお、この設定を行わない場合でも、データ定義言語 (DDL) ステートメントを実行することでユーザー アセンブリおよび CLR モジュールの作成、変更、削除を実行できますが、CLR コードは実行できません。
1)「すべてのプログラム」から、「Microsoft SQL Server 2005 ≫ 構成ツール ≫SQL Server セキュリティ構成」で
「サービスと接続のセキュリティ構成」を開き、画面下にある、「機能のセキュリティ構成」をクリックします。
2)「データベース エンジン」の「CLR 統合」を選択し、「CLR 統合を有効にする」にチェックをつけて「適用」をクリックします。

3)「OK」をクリックし、開いている画面を閉じます。
1)「すべてのプログラム」から、「Microsoft SQL Server 2005 ≫ 構成ツール ≫SQL Server セキュリティ構成」で
「サービスと接続のセキュリティ構成」を開き、画面下にある、「機能のセキュリティ構成」をクリックします。
2)「データベース エンジン」の「CLR 統合」を選択し、「CLR 統合を有効にする」にチェックをつけて「適用」をクリックします。

3)「OK」をクリックし、開いている画面を閉じます。
SQL Server から Access ファイル(MDB)のデータを取得・更新する方法
Access ファイルをリンク サーバーとして登録し、SQL Server から Access のデータを取得・更新する方法について説明します。
新規システムの立ち上げにおいて、ユーザー側で Access ファイルに初期データを登録していただき、システムが使用する SQL Server にデータ移行する場合などで役に立つと思います。
【リンク サーバー の登録】
1)MDBファイルを準備し、SQL Server の稼動しているサーバーに配置する。
2)「サーバー オブジェクト」の「リンク サーバー」で右クリックし、「新しいリンク サーバー」を選択します。

3)「新しいリンク サーバー」の「全般」ページで必要な箇所を入力し、「OK」をクリックします。
・「リンク サーバー」にクエリで使用する際の名称を入力します。
・「サーバーの種類」は「その他のデータ ソース」を選択します。
・「プロバイダ」は「Microsoft Jet 4.0 OLE DB Provider」を選択します。
・「製品名」に任意の文字を入力します。
※特に利用される項目ではありませんが、必須入力のため任意の文字を入力します。
・「データ ソース」に利用する Access ファイルのフルパスを入力します。
・「プロバイダ文字列」は空白のままにします。

4)「サーバー オブジェクト」の「リンク サーバー」に、設定したリンクサーバーが登録されていることを確認します。

【リンク サーバー の利用】
(例)Access の「社員マスタ」のレコードを 、SQL Server の「社員マスタ」に追加する
リンク サーバー内のデータ オブジェクトは、[linked_server_name].[catalog].[schema].[object_name]という 4 部構成の名前で参照できます。Access データベースにはカタログ名とスキーマ名がありません。したがって、Accessのテーブルは、「linked_server...table_name」 という形式で利用できます。
<更新系クエリでエラーが発生した場合>
登録したリンクサーバーに対してUPDATE,DELETE文を実行した際、「更新可能なクエリであることが必要です。」や「指定されたテーブルから削除できませんでした。」などの実行エラーが発生した場合、MDBファイルのセキュリティが適切に設定されているか確認してください。当然、UPDATE,DELETE文を実行するとMDBファイルの内容が変更されるため、権限が無いと実行できません。
新規システムの立ち上げにおいて、ユーザー側で Access ファイルに初期データを登録していただき、システムが使用する SQL Server にデータ移行する場合などで役に立つと思います。
【リンク サーバー の登録】
1)MDBファイルを準備し、SQL Server の稼動しているサーバーに配置する。
2)「サーバー オブジェクト」の「リンク サーバー」で右クリックし、「新しいリンク サーバー」を選択します。

3)「新しいリンク サーバー」の「全般」ページで必要な箇所を入力し、「OK」をクリックします。
・「リンク サーバー」にクエリで使用する際の名称を入力します。
・「サーバーの種類」は「その他のデータ ソース」を選択します。
・「プロバイダ」は「Microsoft Jet 4.0 OLE DB Provider」を選択します。
・「製品名」に任意の文字を入力します。
※特に利用される項目ではありませんが、必須入力のため任意の文字を入力します。
・「データ ソース」に利用する Access ファイルのフルパスを入力します。
・「プロバイダ文字列」は空白のままにします。

4)「サーバー オブジェクト」の「リンク サーバー」に、設定したリンクサーバーが登録されていることを確認します。

【リンク サーバー の利用】
(例)Access の「社員マスタ」のレコードを 、SQL Server の「社員マスタ」に追加する
INSERT INTO 社員マスタ
SELECT * FROM 初期登録データ...社員マスタ/* この行のみ実行すると、Access のデータを確認できます */
ポイントは「初期登録データ...社員マスタ」の部分です。SELECT * FROM 初期登録データ...社員マスタ/* この行のみ実行すると、Access のデータを確認できます */
リンク サーバー内のデータ オブジェクトは、[linked_server_name].[catalog].[schema].[object_name]という 4 部構成の名前で参照できます。Access データベースにはカタログ名とスキーマ名がありません。したがって、Accessのテーブルは、「linked_server...table_name」 という形式で利用できます。
<更新系クエリでエラーが発生した場合>
登録したリンクサーバーに対してUPDATE,DELETE文を実行した際、「更新可能なクエリであることが必要です。」や「指定されたテーブルから削除できませんでした。」などの実行エラーが発生した場合、MDBファイルのセキュリティが適切に設定されているか確認してください。当然、UPDATE,DELETE文を実行するとMDBファイルの内容が変更されるため、権限が無いと実行できません。
SQLの実行時間をミリ秒単位で計測する方法
開発中にSQLのチューニングを行っていると、処理時間の改善結果をミリ秒単位で計測したい場合があると思います。しかし、Management Studio でSQLを実行した際に画面右下に表示される実行時間は秒単位であるため、ミリ秒単位の計測には向いていません。そこで、簡単にSQLの実行時間を計測できるサンプルを紹介します。
DECLARE @StartTime datetime -- 処理開始時刻保存用変数
SET @StartTime = GETDATE() -- 処理開始時刻設定
/* ↓↓↓ 以下に処理時間を計測したいSQL文を書く(下記は500,000回ループを回すサンプル) */
DECLARE @Counter integer
SET @Counter = 0
WHILE (@Counter < 500000)
BEGIN
SET @Counter = @Counter + 1
END
/* ↑↑↑ ここまで計測対象 */
SELECT CONVERT(varchar,GETDATE()-@StartTime,114) AS 実行時間 -- 処理時間を出力
Management Studio では0秒と表示されていたSQL文をシステムから同時に複数呼び出した際、レスポンスが想定より悪かった場合が実際によくあります。常に細かいレベルで実行速度を心がけたコーディングを行うことで、後々の余分な手戻りを防ぐ有効な手段になると思います。SET @StartTime = GETDATE() -- 処理開始時刻設定
/* ↓↓↓ 以下に処理時間を計測したいSQL文を書く(下記は500,000回ループを回すサンプル) */
DECLARE @Counter integer
SET @Counter = 0
WHILE (@Counter < 500000)
BEGIN
SET @Counter = @Counter + 1
END
/* ↑↑↑ ここまで計測対象 */
SELECT CONVERT(varchar,GETDATE()-@StartTime,114) AS 実行時間 -- 処理時間を出力








