方法: CLR データベース オブジェクトを操作する

Transact-SQL プログラミング言語に加えて、.NET Framework 言語を使用して、データを取得および更新するデータベース オブジェクトを作成できます。 マネージド コードで記述されたデータベース オブジェクトは、SQL Server Common Language Run (CLR) データベース オブジェクトと呼ばれます。 SQL Server でホストされている CLR データベース オブジェクトを使用する利点と、Transact-SQL と CLR のどちらを選択するかについては、「 CLR 統合の概要 」と「 マネージド コードを使用してデータベース オブジェクトを作成する利点」を参照してください。

SQL Server Data Tools を使用して CLR データベース オブジェクトを作成するには、データベース プロジェクトを作成し、それに CLR データベース オブジェクトを追加します。 以前のバージョンの Visual Studio とは異なり、別の CLR プロジェクトを作成し、データベース プロジェクトから参照を追加する必要はありません。 データベース プロジェクトをビルドして発行すると、プロジェクト内の CLR オブジェクトが同時に自動的に発行されます。 これらの CLR オブジェクトを発行した後は、他のデータベース オブジェクトと同様に呼び出して実行できます。

CLR および CLR Build プロパティ ページには、プロジェクトで CLR データベース オブジェクトを使用するための多くの設定が含まれています。 具体的には、CLR プロパティ ページには、CLR アセンブリに対するアクセス許可を設定するためのアクセス許可レベルの設定があります。 また、プロジェクトに追加された CLR データベース オブジェクトの DDL を生成するかどうかを制御する [DDL の生成] 設定もあります。 [CLR ビルド] プロパティ ページには、プロジェクト内の CLR コードのコンパイルを構成するために設定できるすべてのコンパイラ オプションが含まれています。 これらのプロパティ ページにアクセスするには、 ソリューション エクスプローラー でプロジェクトを右クリックし、[ プロパティ] を選択します。

CLR データベース オブジェクトのデバッグを有効にするには、 SQL Server オブジェクト エクスプローラーを開きます。 デバッグする CLR データベース成果物を含むサーバーを右クリックし、[ SQL/CLR デバッグの許可] を選択します。 警告が表示されたメッセージ ボックスが表示されます。

During debugging, all managed threads on this server stop. Do you wish to enable SQL CLR debugging on this server?

CLR データベース オブジェクトをデバッグする場合、実行を中断すると、サーバー上のすべてのスレッドが中断され、他のユーザーに影響が及びます。 このため、運用サーバー上の CLR データベース オブジェクトのアプリケーションをデバッグしないでください。 また、デバッグを開始すると、 SQL Server オブジェクト エクスプローラーで設定を変更するには遅すぎることにも注意してください。 SQL Server オブジェクト エクスプローラーで行われた変更は、次のデバッグ セッションが開始されるまで有効になりません。

CLR データベース オブジェクトのビルド要件の詳細については、「 共通言語ランタイム (CLR) 統合を使用したデータベース オブジェクトの構築」を参照してください。

Warnung

次の手順では、 SQL データベース プロジェクト セクションの前の手順で作成したエンティティを使用します。

CLR データベース オブジェクトをプロジェクトに追加する

  1. TradeDev データベース プロジェクトを右クリックし、[追加]、[新しい項目] の順に選択します。

  2. C# SQL CLR テンプレート、SQL CLR User-Defined 関数の順に選択します。 既定の名前をそのまま使用し、[追加] を選択 します

  3. クラス本体に次のコードを追加します。 この関数は、米国の電話番号を検証します。 3 つの数字で構成する必要があります。必要に応じてかっこで囲み、その後に 3 つの数字のセットを続けて、4 つの数字のセットを続けます。 サポートされている形式の例としては、(425) 555-0123、425-555-0123、425 555 0123、1-425-555-0123 があります。

    [SqlFunction(IsDeterministic = true, IsPrecise = true)]
    public static SqlBoolean validatePhone(SqlString phone)
    {
        string aNorthAmericanPhoneNumberPattern = @"^[01]?[- .]?(\([2-9]\d{2}\)|[2-9]\d{2})[- .]?\d{3}[- .]?\d{4}$";
        if (!phone.IsNull)
        {
           Regex regex = new Regex(aNorthAmericanPhoneNumberPattern);
           return regex.IsMatch(phone.Value);
        }
        return true;
     }
    
  4. Regex は赤で下線が引かれます。 Regex右クリックし、[解決] を選択し、System.Text.RegularExpressions を使用します。

  5. Microsoft SQL Server 2012 サーバー インスタンスに対して開発している場合は、この手順をスキップできます。 それ以外の場合、SQL Server 2005 および SQL Server 2008 では、.NET Framework の 2.0、3.0、または 3.5 バージョンでビルドされたデータベース プロジェクトのみがサポートされます。 .NET ターゲット プラットフォームが正しく設定されていることを確認するには、TradeDev データベース プロジェクトを右クリックし、[プロパティ] を選択します。 SQLCLR プロパティ ページで、ターゲット プラットフォーム.NET Framework 3.5 以下に変更します。 最後の画面で [ はい ] を選択して、プロジェクトを閉じてから再度開きます。

  6. TradeDev プロジェクトを右クリックし、[ビルド] を選択してプロジェクトをビルドします。

  7. Suppliers.sqlダブルクリックし、[ ビュー デザイナー ] を選択して、テーブル デザイナーで Suppliers テーブルを開きます。

  8. 列グリッドで空の行を選択して、テーブルに新しい列を追加します。 [名前] フィールドに電話を入力し、[データ型] に nvarchar (128) を入力し、[Null を許可] フィールドをオンのままにします。

  9. コンテキスト ペインで [ Check Constraints] \(制約の確認\) ノードを右クリックし、[ 新しいチェック制約の追加] を選択します。

  10. スクリプト ペインの制約の既定の定義を次のように置き換えます。

    CONSTRAINT [CK_Suppliers_CheckPhone] CHECK (dbo.validatePhone(phone)=1),
    

    これにより、前に追加した CLR UDF を使用して、新しい電話フィールドへの入力が確実にチェックされます。

  11. F5 キーを押してプロジェクトをビルドし、ローカル データベースに配置します。

CLR データベース オブジェクトを使用する

  1. SQL Server オブジェクト エクスプローラーで、プロジェクトを配置するローカル データベースに移動します。

  2. 既定では、SQL Server では CLR 統合が無効になっています。 CLR データベース オブジェクトを使用するには、CLR 統合を有効にする必要があります。 これを行うには、 sp_configure ストアド プロシージャの "clr enabled" オプションを使用します。 詳細については、 clr 対応オプションに関する記事を参照してください。

    データベースを右クリックし、[ 新しいクエリ] を選択します。 クエリ ウィンドウで、次のコードを貼り付け、[ クエリの実行 ] ボタンを押します。

    EXECUTE sp_configure 'clr enabled', 1;
    GO
    
    RECONFIGURE;
    GO
    
  3. [仕入先] テーブルを右クリックし、[ データの表示] を選択します。

  4. 5 には名前には Contoso を入力し、[住所] フィールドは空のままにし、425 3122 1222の場合はを入力します。 Tab キーを 押して電話 フィールドから離れ、メッセージがポップアップ表示され、 INSERT ステートメントが既存の check 制約と競合していることを示します。これは、定義済みの電話パターンを使用して 電話 フィールドの入力をチェックします。

  5. 入力を425 312 1222に変更し、Tabキーを押して離れます。 今回は入力が受け入れられます。