次の方法で共有


チュートリアル : マネージ コードでのストアド プロシージャの作成

更新 : 2007 年 11 月

Visual Basic、C#、C++ などの .NET Framework 言語を使用することにより、SQL Server 2005 データベース用のストアド プロシージャをマネージ コードで記述できるようになりました。マネージ コードで記述されたストアド プロシージャを、CLR ストアド プロシージャと呼びます。

SQL ストアド プロシージャを作成するには、[ストアド プロシージャ] 項目を SQL Server プロジェクトに追加します。SQL Server に正しく配置すると、マネージ コードで作成されたストアド プロシージャは、他のストアド プロシージャと同様に呼び出され、実行されます。

このチュートリアルでは、以下のタスクを行います。

  • 新しい Windows アプリケーション プロジェクトの作成

  • マネージ コードでのストアド プロシージャの作成

  • SQL Server 2005 データベースへのストアド プロシージャの配置

  • データベースでストアド プロシージャをテストするためのスクリプトの作成

  • ストアド プロシージャが正しく実行されることを確認するためのデータベースのデータの照会

前提条件

このチュートリアルを実行するための要件は次のとおりです。

プロジェクトの作成

新しい SQL Server プロジェクトを作成するには

  1. [ファイル] メニューで新しいプロジェクトを作成します。

  2. [SQL Server プロジェクト] を選択し、プロジェクトに「SQLCLRStoredProcedure」という名前を付けて、[OK] をクリックします。詳細については、「方法 : SQL Server プロジェクトを作成する」を参照してください。

SQL Server 2005 データベースとの接続

このチュートリアルでは、SQL Server 2005 で実行している AdventureWorks サンプル データベースへの接続が必要です。サーバー エクスプローラで AdventureWorks サンプル データベースへの接続が使用可能である場合は、その接続が [データベース参照の追加] ダイアログ ボックスに表示されます。

zxsa8hkf.alert_note(ja-jp,VS.90).gifメモ :

既定では、Microsoft SQL Server で共通言語ランタイム (CLR) 統合機能が無効になっているので、SQL Server プロジェクト項目を使用するにはこの機能を有効にする必要があります。CLR 統合を有効にするには、sp_configure ストアド プロシージャの clr enabled オプションを使用します。詳細については、「CLR 統合の有効化」を参照してください。

AdventureWorks サンプル データベースに接続するには

  • [接続の追加] ダイアログ ボックスの必要項目をすべて入力して、SQL Server 2005 に含まれる AdventureWorks サンプル データベースに接続します。詳細については、「接続の追加/変更 (Microsoft SQL Server)」を参照してください。

    または

  • [データベース参照の追加] ダイアログ ボックスで、AdventureWorks サンプル データベースへの既存の接続を選択します。詳細については、「[データベース参照の追加] ダイアログ ボックス」を参照してください。

SQL Server のストアド プロシージャの作成

SQL Server プロジェクトの作成後に、そのプロジェクトにストアド プロシージャを追加します。

SQL Server のストアド プロシージャを作成するには

  1. [プロジェクト] メニューの [新しい項目の追加] をクリックします。

  2. [新しい項目の追加] ダイアログ ボックスの [ストアド プロシージャ] を選択します。

  3. 新しいストアド プロシージャの [ファイル名] として、「InsertCurrency」と入力します。

  4. [追加] をクリックします。

  5. コード エディタでコードを次のコードに置き換えます。

    zxsa8hkf.alert_note(ja-jp,VS.90).gifメモ :

    C++ の例は、/clr:safe コンパイラ オプションを使ってコンパイルする必要があります。

    Imports System
    Imports System.Data
    Imports System.Data.SqlClient
    Imports System.Data.SqlTypes
    Imports Microsoft.SqlServer.Server
    
    Partial Public Class StoredProcedures
    
        <SqlProcedure()> _
        Public Shared Sub InsertCurrency( _
            ByVal currencyCode As SqlString, ByVal name As SqlString)
    
            Using conn As New SqlConnection("context connection=true")
    
                Dim InsertCurrencyCommand As New SqlCommand()
                Dim currencyCodeParam As New SqlParameter("@CurrencyCode", SqlDbType.NVarChar)
                Dim nameParam As New SqlParameter("@Name", SqlDbType.NVarChar)
    
                currencyCodeParam.Value = currencyCode
                nameParam.Value = name
    
    
                InsertCurrencyCommand.Parameters.Add(currencyCodeParam)
                InsertCurrencyCommand.Parameters.Add(nameParam)
    
                InsertCurrencyCommand.CommandText = _
                    "INSERT Sales.Currency (CurrencyCode, Name, ModifiedDate)" & _
                    " VALUES(@CurrencyCode, @Name, GetDate())"
    
                InsertCurrencyCommand.Connection = conn
    
                conn.Open()
                InsertCurrencyCommand.ExecuteNonQuery()
                conn.Close()
            End Using
        End Sub
    End Class
    
    using System;
    using System.Data;
    using System.Data.SqlClient;
    using System.Data.SqlTypes;
    using Microsoft.SqlServer.Server;
    
    
    public partial class StoredProcedures
    {
        [SqlProcedure()]
        public static void InsertCurrency_CS(
            SqlString currencyCode, SqlString name)
        {
            using (SqlConnection conn = new SqlConnection("context connection=true"))
            {
                SqlCommand InsertCurrencyCommand = new SqlCommand();
                SqlParameter currencyCodeParam = new SqlParameter("@CurrencyCode", SqlDbType.NVarChar);
                SqlParameter nameParam = new SqlParameter("@Name", SqlDbType.NVarChar);
    
                currencyCodeParam.Value = currencyCode;
                nameParam.Value = name;
    
                InsertCurrencyCommand.Parameters.Add(currencyCodeParam);
                InsertCurrencyCommand.Parameters.Add(nameParam);
    
                InsertCurrencyCommand.CommandText =
                    "INSERT Sales.Currency (CurrencyCode, Name, ModifiedDate)" +
                    " VALUES(@CurrencyCode, @Name, GetDate())";
    
                InsertCurrencyCommand.Connection = conn;
    
                conn.Open();
                InsertCurrencyCommand.ExecuteNonQuery();
                conn.Close();
            }
        }
    }
    
    #include "stdafx.h"
    
    #using <System.dll>
    #using <System.Data.dll>
    #using <System.Xml.dll>
    
    using namespace System;
    using namespace System::Data;
    using namespace System::Data::Sql;
    using namespace System::Data::SqlClient;
    using namespace System::Data::SqlTypes;
    using namespace Microsoft::SqlServer::Server;
    
    // In order to debug your Stored Procedure, add the following to your debug.sql file:
    //
    // EXEC InsertCurrency_CPP 'AAA', 'Currency Test'
    // SELECT * FROM Sales.Currency WHERE CurrencyCode = 'AAA'
    
    public ref class StoredProcedures
    {
    public:
        [SqlProcedure]
        static void InsertCurrency_CPP(SqlString currencyCode, SqlString name)
        {
            SqlConnection ^conn = gcnew SqlConnection("context connection=true");
    
            SqlCommand ^insertCurrencyCommand = gcnew SqlCommand();
            SqlParameter ^currencyCodeParam =
                gcnew SqlParameter("@CurrencyCode", SqlDbType::NVarChar);
            SqlParameter ^nameParam =
                gcnew SqlParameter("@Name", SqlDbType::NVarChar);
    
            insertCurrencyCommand->CommandText =
                "insert Sales.Currency(CurrencyCode, Name, ModifiedDate)" +
                " values(@CurrencyCode, @Name)";
            insertCurrencyCommand->Connection = conn;
    
            conn->Open();
            insertCurrencyCommand->ExecuteNonQuery();
    
            conn->Close();
        }
    };
    

ストアド プロシージャの配置、実行、およびデバッグ

新しいストアド プロシージャを作成した後で、このストアド プロシージャのビルド、SQL Server への配置、およびデバッグを、F5 キーを押して実行できます。まず、プロジェクトの TestScripts フォルダにある Test.sql ファイル内に、ストアド プロシージャの実行とテストを行うコードを追加します。Visual C++ では、このファイルの名前が debug.sql になります。テスト スクリプトの作成方法の詳細については、「方法 : Test.sql スクリプトを編集して SQL オブジェクトを実行する」を参照してください。

SQL のデバッグの詳細については、「SQL データベース オブジェクトのデバッグ」を参照してください。

InsertCurrency ストアド プロシージャを配置して実行するには

  1. Visual Basic および Visual C# の場合は、ソリューション エクスプローラで TestScripts フォルダを展開し、Test.sql ファイルをダブルクリックします。

    Visual C++ の場合は、ソリューション エクスプローラで debug.sql ファイルをダブルクリックします。

  2. Test.sql (Visual C++ の場合は debug.sql) ファイルのコードを次のコードで置き換えます。

    EXEC InsertCurrency 'AAA', 'Currency Test'
    SELECT * from Sales.Currency where CurrencyCode = 'AAA'
    
  3. F5 キーを押して、ストアド プロシージャをビルド、配置、およびデバッグします。デバッグせずに配置する方法については、「方法 : SQL Server のプロジェクト項目を SQL Server に配置する」を参照してください。

    [出力] ウィンドウに表示された結果を参照して、[出力元の表示 : データベース出力] を選択します。

参照

処理手順

方法 : CLR の SQL Server ストアド プロシージャを作成および実行する

方法 : CLR の SQL Server トリガを作成および実行する

方法 : CLR の SQL Server の集計を作成および実行する

方法 : CLR の SQL Server ユーザー定義関数を作成および実行する

方法 : CLR の SQL Server ユーザー定義型を作成および実行する

方法 : SQL CLR のストアド プロシージャをデバッグする

概念

SQL Server の CLR 統合の概要 (ADO.NET)

マネージ コードを使用したデータベース オブジェクトの作成の利点

SQL Server プロジェクト用の項目テンプレート

参照

SQL Server プロジェクトおよびデータベース オブジェクトの属性

その他の技術情報

SQL CLR データベースのデバッグ