次の方法で共有


Hello World サンプル

Hello World サンプルでは、共通言語ランタイム (CLR) 統合ベースの単純なストアド プロシージャの作成、展開、およびテストにかかわる基本的な操作について示します。 また、このサンプルでは、ストアド プロシージャによって動的に構築されて呼び出し元に返されるレコードを使用してデータを返す方法についても示します。

ストアド プロシージャは HelloWorld 、1 つの行で構成される結果セットで文字列 "Hello world!" を返します。 この例では、 クラス Microsoft.SqlServer.Server.SqlMetaDataMicrosoft.SqlServer.Server.SqlDataRecordMicrosoft.SqlServer.Server.Pipe のいくつかの使用方法を示します。

前提条件

このプロジェクトを作成して実行するには、次のソフトウェアがインストールされている必要があります。

  • SQL ServerまたはSQL Server Express。 SQL Server Expressドキュメントとサンプル Web サイトからSQL Server Expressを無料で入手できます

  • SQL Server Developer Web サイトで使用できる AdventureWorks データベース

  • .NET Framework SDK 2.0 以降または Microsoft Visual Studio 2005 以降。 .NET Framework SDK は無償で入手できます。

  • また、次の条件を満たしている必要があります。

  • 使用しているSQL Server インスタンスで CLR 統合が有効になっている必要があります。

  • CLR 統合を有効にするには、次の手順に従います。

    CLR 統合の有効化

    • 次の Transact-SQL コマンドを実行します。

    sp_configure 'clr enabled', 1

    GO

    RECONFIGURE

    GO

    注意

    CLR を有効にするには、サーバー レベルのアクセス許可がALTER SETTINGS必要です。これは、 および serveradmin 固定サーバー ロールのsysadminメンバーによって暗黙的に保持されます。

  • AdventureWorks データベースは、使用しているSQL Server インスタンスにインストールする必要があります。

  • 使用しているSQL Server インスタンスの管理者でない場合は、インストールを完了するための CreateAssembly アクセス許可を管理者に付与する必要があります。

サンプルのビルド

次の手順に従ってサンプルを作成し、実行します。

  1. Visual Studio または .NET Framework のコマンド プロンプトを開きます。

  2. 必要な場合は、サンプル用のディレクトリを作成します。 この例では C:\MySample を使用します。

  3. c:\MySample で、HelloWorld.vb (Visual Basic サンプル) または HelloWorld.cs (C# サンプル) を作成し、適切な Visual Basic または C# のサンプル コード (下記) をこのファイルにコピーします。

  4. 選択した言語に応じて次のいずれかをコマンド プロンプトで実行し、サンプル コードをコンパイルします。

    • vbc C:HelloWorld.vb /target:library

    • csc /target:library HelloWorld.cs

  5. Transact-SQL インストール コードをファイルにコピーし、サンプル ディレクトリに として Install.sql 保存します。

  6. 次のコマンドを実行して、アセンブリとストアド プロシージャを配置します。

    • sqlcmd -E -I -i install.sql -v root = "C:\MySample\"
  7. Transact-SQL テスト コマンド スクリプトをファイルにコピーし、サンプル ディレクトリに として test.sql 保存します。

  8. 次のコマンドを使用してテスト スクリプトを実行します。

    • sqlcmd -E -I -i test.sql
  9. Transact-SQL クリーンアップ スクリプトをファイルにコピーし、サンプル ディレクトリに として cleanup.sql 保存します。

  10. 次のコマンドを使用してこのスクリプトを実行します。

    • sqlcmd -E -I -i cleanup.sql

サンプル コード

このサンプルのコード リストを次に示します。

C#

using System;  
using System.Data;  
using System.Data.SqlClient;  
using System.Data.SqlTypes;  
using Microsoft.SqlServer.Server;  
public partial class StoredProcedures  
{  
    [Microsoft.SqlServer.Server.SqlProcedure]  
    public static void HelloWorld()  
    {  
        Microsoft.SqlServer.Server.SqlMetaData columnInfo  
                = new Microsoft.SqlServer.Server.SqlMetaData("Column1", SqlDbType.NVarChar, 12);  
        SqlDataRecord greetingRecord  
            = new SqlDataRecord(new Microsoft.SqlServer.Server.SqlMetaData[] { columnInfo });  
        greetingRecord.SetString(0, "Hello world!");  
        SqlContext.Pipe.Send(greetingRecord);  
    }  
};  
  

Visual Basic

Imports System  
Imports System.Data  
Imports System.Data.Sql  
Imports System.Data.SqlTypes  
Imports Microsoft.SqlServer.Server  
  
Partial Public NotInheritable Class StoredProcedures  
    <Microsoft.SqlServer.Server.SqlProcedure()> _  
    Public Shared Sub HelloWorld()  
        Dim columnInfo As New Microsoft.SqlServer.Server.SqlMetaData("Column1", _  
            SqlDbType.NVarChar, 12)  
        Dim greetingRecord As New SqlDataRecord(New  _  
            Microsoft.SqlServer.Server.SqlMetaData() {columnInfo})  
        greetingRecord.SetString(0, "Hello World!")  
        SqlContext.Pipe.Send(greetingRecord)  
    End Sub  
End Class  

これは Transact-SQL インストール スクリプト (Install.sql) で、アセンブリを配置し、データベースにストアド プロシージャを作成します。

USE AdventureWorks  
GO  
IF EXISTS (SELECT * FROM sys.procedures WHERE [name] = 'usp_HelloWorld')  
DROP PROCEDURE usp_HelloWorld;  
GO  
IF EXISTS (SELECT * FROM sys.assemblies WHERE [name] = 'HelloWorld')  
DROP ASSEMBLY HelloWorld;  
GO  
DECLARE @SamplesPath nvarchar(1024)  
set @SamplesPath = '$(root)'  
CREATE ASSEMBLY HelloWorld   
FROM @SamplesPath + 'HelloWorld.dll'  
WITH permission_set = Safe;  
GO  
  
CREATE PROCEDURE usp_HelloWorld  
--(  
--    @Greeting nvarchar(12) OUTPUT  
--)  
AS EXTERNAL NAME HelloWorld.[StoredProcedures].HelloWorld;  
GO  

次の test.sql は、ストアド プロシージャを実行してサンプルをテストします。

use AdventureWorks  
go  
execute usp_HelloWorld  
  
USE AdventureWorks;  
GO  
IF EXISTS (SELECT * FROM sys.procedures WHERE [name] = 'usp_HelloWorld')  
DROP PROCEDURE usp_HelloWorld;  
GO  

次の Transact-SQL は、アセンブリとストアド プロシージャをデータベースから削除します。

USE AdventureWorks  
GO  
  
IF EXISTS (SELECT * FROM sys.procedures WHERE [name] = 'usp_HelloWorld')  
DROP PROCEDURE usp_HelloWorld;  
GO  
  
IF EXISTS (SELECT * FROM sys.assemblies WHERE [name] = 'HelloWorld')  
DROP ASSEMBLY HelloWorld;  
GO  

参照

CLR (共通言語ランタイム) 統合の使用シナリオと例