Hello World サンプル
Hello World サンプルでは、共通言語ランタイム (CLR) 統合ベースの単純なストアド プロシージャの作成、展開、およびテストにかかわる基本的な操作について示します。 また、このサンプルでは、ストアド プロシージャによって動的に構築されて呼び出し元に返されるレコードを使用してデータを返す方法についても示します。
ストアド プロシージャは HelloWorld
、1 つの行で構成される結果セットで文字列 "Hello world!" を返します。 この例では、 クラス Microsoft.SqlServer.Server.SqlMetaData、 Microsoft.SqlServer.Server.SqlDataRecord 、 Microsoft.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 アクセス許可を管理者に付与する必要があります。
サンプルのビルド
次の手順に従ってサンプルを作成し、実行します。
Visual Studio または .NET Framework のコマンド プロンプトを開きます。
必要な場合は、サンプル用のディレクトリを作成します。 この例では C:\MySample を使用します。
c:\MySample で、
HelloWorld.vb
(Visual Basic サンプル) またはHelloWorld.cs
(C# サンプル) を作成し、適切な Visual Basic または C# のサンプル コード (下記) をこのファイルにコピーします。選択した言語に応じて次のいずれかをコマンド プロンプトで実行し、サンプル コードをコンパイルします。
vbc C:HelloWorld.vb /target:library
csc /target:library HelloWorld.cs
Transact-SQL インストール コードをファイルにコピーし、サンプル ディレクトリに として
Install.sql
保存します。次のコマンドを実行して、アセンブリとストアド プロシージャを配置します。
sqlcmd -E -I -i install.sql -v root = "C:\MySample\"
Transact-SQL テスト コマンド スクリプトをファイルにコピーし、サンプル ディレクトリに として
test.sql
保存します。次のコマンドを使用してテスト スクリプトを実行します。
sqlcmd -E -I -i test.sql
Transact-SQL クリーンアップ スクリプトをファイルにコピーし、サンプル ディレクトリに として
cleanup.sql
保存します。次のコマンドを使用してこのスクリプトを実行します。
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