Entity Frameworkで出力パラメータを持つストアドプロシージャを簡単に実行

2024-04-02

SQL Serverで出力パラメータを持つストアドプロシージャを実行する方法

出力パラメータを持つストアドプロシージャの作成

  1. SQL Server Management Studio (SSMS) を開きます。
  2. 対象となるデータベースに接続します。
  3. オブジェクトエクスプローラーで ストアドプロシージャ フォルダを展開します。
  4. 右クリックして 新しいストアドプロシージャ を選択します。
  5. ストアドプロシージャの名前を入力します (例: GetCustomerCount)。
  6. 作成 をクリックします。
  7. ストアドプロシージャのコードエディタが表示されます。
  8. 以下のコード例を参考に、出力パラメータと処理内容を記述します。
USE [AdventureWorks2019]
GO

CREATE PROCEDURE [dbo].[GetCustomerCount]
	@OutputCustomerCount INT OUTPUT
AS
BEGIN
	SELECT @OutputCustomerCount = COUNT(*)
	FROM [Person].[Customer]
END
GO

この例では、@OutputCustomerCount という名前の出力パラメータを作成し、Person.Customer テーブルの顧客数を格納しています。

出力パラメータを持つストアドプロシージャの実行

  1. SSMS で クエリ エディタ を開きます。
  2. 以下のコード例を参考に、ストアドプロシージャを実行します。
DECLARE @CustomerCount INT

EXEC [dbo].[GetCustomerCount] @OutputCustomerCount OUTPUT

SELECT @CustomerCount

この例では、@CustomerCount という変数を宣言し、GetCustomerCount ストアドプロシージャを実行して出力パラメータの値を取得しています。

その他の注意事項

  • 出力パラメータは、必ず OUTPUT キーワードで宣言する必要があります。
  • 出力パラメータは、ストアドプロシージャ内で値が割り当てられる必要があります。
  • 出力パラメータの値は、呼び出し元で変数に格納することができます。
  • 出力パラメータは、複数のデータ型をサポートしています (例: INT, VARCHAR, DATETIME など)。



USE [AdventureWorks2019]
GO

CREATE PROCEDURE [dbo].[GetCustomerCount]
	@OutputCustomerCount INT OUTPUT
AS
BEGIN
	SELECT @OutputCustomerCount = COUNT(*)
	FROM [Person].[Customer]
END
GO

呼び出しコード

DECLARE @CustomerCount INT

EXEC [dbo].[GetCustomerCount] @OutputCustomerCount OUTPUT

SELECT @CustomerCount

出力

12648

このサンプルコードでは、GetCustomerCount ストアドプロシージャを作成して、Person.Customer テーブルの顧客数を取得しています。出力パラメータ @OutputCustomerCount は、呼び出し元で変数 @CustomerCount に格納され、結果として 12648 という値が出力されます。

  • 顧客情報の取得:
USE [AdventureWorks2019]
GO

CREATE PROCEDURE [dbo].[GetCustomerInfo]
	@CustomerID INT,
	@OutputFirstName VARCHAR(50) OUTPUT,
	@OutputLastName VARCHAR(50) OUTPUT
AS
BEGIN
	SELECT @OutputFirstName = FirstName,
		   @OutputLastName = LastName
	FROM [Person].[Customer]
	WHERE CustomerID = @CustomerID
END
GO

DECLARE @FirstName VARCHAR(50),
		@LastName VARCHAR(50)

EXEC [dbo].[GetCustomerInfo] 1234, @OutputFirstName OUTPUT, @OutputLastName OUTPUT

SELECT @FirstName, @LastName
  • 製品情報の更新:
USE [AdventureWorks2019]
GO

CREATE PROCEDURE [dbo].[UpdateProductPrice]
	@ProductID INT,
	@NewPrice MONEY,
	@OutputRowsAffected INT OUTPUT
AS
BEGIN
	UPDATE [Production].[Product]
	SET StandardCost = @NewPrice
	WHERE ProductID = @ProductID

	SET @OutputRowsAffected = @@ROWCOUNT
END
GO

DECLARE @RowsAffected INT

EXEC [dbo].[UpdateProductPrice] 789, 100.00, @OutputRowsAffected OUTPUT

SELECT @RowsAffected

これらのサンプルコードは、出力パラメータを持つストアドプロシージャの使用方法を理解するのに役立ちます。




出力パラメータを持つストアドプロシージャを実行する他の方法

Transact-SQL (T-SQL) コマンド

EXEC [dbo].[GetCustomerCount] @OutputCustomerCount OUTPUT

SELECT @OutputCustomerCount

ADO.NET

using (var connection = new SqlConnection("..."))
{
    var cmd = new SqlCommand("[dbo].[GetCustomerCount]", connection);
    cmd.CommandType = CommandType.StoredProcedure;

    var outputParameter = new SqlParameter("@OutputCustomerCount", SqlDbType.Int);
    outputParameter.Direction = ParameterDirection.Output;
    cmd.Parameters.Add(outputParameter);

    cmd.ExecuteNonQuery();

    var customerCount = (int)outputParameter.Value;
}

Entity Framework

using (var context = new AdventureWorks2019Context())
{
    var customerCount = context.Database.SqlQuery<int>("EXEC [dbo].[GetCustomerCount] @OutputCustomerCount OUTPUT",
        new SqlParameter("@OutputCustomerCount", SqlDbType.Int) { Direction = ParameterDirection.Output });
}

その他の言語

上記以外にも、Python、Java、JavaScript などの様々な言語から出力パラメータを持つストアドプロシージャを実行することができます。それぞれの言語に合ったライブラリやツールを使用する必要があります。

どの方法を選択するべきかは、開発環境や要件によって異なります。以下は、それぞれの方法の利点と欠点です。

SSMS

  • 利点:
    • GUI で簡単に操作できる
    • パラメータの設定や結果の確認が容易
  • 欠点:
    • スクリプトを実行できない
    • 自動化に向いていない
  • 利点:
    • .NET Framework で標準的にサポートされている
    • オブジェクト指向で使いやすい
  • 欠点:
  • 利点:
  • 欠点:
  • 利点:
  • 欠点:

これらの利点と欠点を考慮して、自分に合った方法を選択してください。


sql-server stored-procedures


IS NULL、LEN、COALESCE... SQL Server テキスト列の空判定

IS NULL 演算子は、列が NULL かどうかを確認するために使用できます。この例では、テーブル名 テーブルの 列名 列が NULL のすべての行が返されます。LEN 関数は、文字列の長さを返します。空の文字列の長さは 0 なので、次のように LEN 関数を使用して、列が空かどうかを確認できます。...


nvarchar(MAX) vs. varchar(n) vs. ntext vs. xml:最適なデータ型を選ぶための比較

nvarchar(MAX) を常に使用することは、いくつかの利点があります。文字列長の制限を気にする必要がありません。非常に長い文字列を格納できます。将来的に文字列が長くなる可能性がある場合に備えて、柔軟性を確保できます。パフォーマンスの低下...


SQL Server 2008でテーブルをドロップせずに列を変更する方法

SQL Server 2008でテーブルをドロップせずに列を変更するには、いくつかの方法があります。方法ALTER TABLE ステートメントを使用するこの方法は、列のデータ型、名前、NULL許容性などを変更するのに最もよく使用されます。例:...


SQL Server 2005で既存の列をNOT NULLに設定する方法

このチュートリアルでは、Microsoft SQL Serverのテーブルで既存の列をNOT NULLに設定する方法について説明します。手順SQL Server Management Studio (SSMS) を起動し、データベースに接続します。...


SQL Serverで重複行を効率的に見つける5つの方法

DISTINCT 句を使用する最も基本的な方法は、DISTINCT 句を使用することです。これは、選択された列の値が一致するすべての行のうち、最初の行のみを返します。このクエリは、列1、列2、列3 の値が一致するすべての行のうち、最初の行のみを返します。重複行は除外されます。...