0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ストアドファンクション(テーブル値関数)を作成する方法

Posted at

売上年月を受け取り、その年月に売上のあった商品コードのテーブル返す
[GetSoldItems]というテーブル値関数を作成します:smiley:
以下は売上テーブルです。
image.png

実行するスクリプト

CREATE FUNCTION [GetSoldItems]
(	
	@FROM datetime,
	@TO datetime
)
RETURNS @SoldItems TABLE (
	商品ID NCHAR(10) NOT NULL
)
AS
BEGIN 
	INSERT INTO @SoldItems ( 商品ID )
	SELECT DISTINCT 商品ID FROM 売上 WHERE 売上日 BETWEEN @FROM AND @TO
	RETURN;
END

上記スクリプトを実行すると、以下のようにテーブル値関数が作成されます。
image.png

実行結果

SELECT * FROM 商品マスタ	
INNER JOIN dbo.GetSoldItems('2023-11-01 00:00:00', '2023-11-30 00:00:00') 売上済商品
ON 商品マスタ.商品ID = 売上済商品.商品ID

image.png
引数で指定した年月に売上のあった商品コードを取得することができました。

ポイント

:pencil2:テーブル値関数について

  • テーブル値関数の最後のステートメントはRETURNです。
  • テーブルの値を更新・挿入・削除するようなステートメントは記載できません。
  • テーブル値関数を作成する構文は以下の通りです。
CREATE FUNCTION [ ファンクション名 ] (
   [ @入力パラメーター名1 ] [ 入力パラメーター名1のデータ型 ],
   [ @入力パラメーター名2 ] [ 入力パラメーター名2のデータ型 ],
   [ @入力パラメーター名3 ] [ 入力パラメーター名3のデータ型 ]
)  
RETURNS [ @戻り値のテーブル名 ] TABLE (
   [カラム名1] [カラム名1のデータ型] [NULL or NOT NULLなどのテーブル定義],
   [カラム名2] [カラム名2のデータ型] [NULL or NOT NULLなどのテーブル定義],
   [カラム名3] [カラム名3のデータ型] [NULL or NOT NULLなどのテーブル定義]
)
AS
BEGIN
   [ ファンクションで処理したい一連のT-SQLステートメント
     @戻り値のテーブルに値をインサートする ]

   RETURN;
END;

:pencil2: DISTINCTについて

  • 重複したレコードを一行にまとめることができます。
SELECT DISTINCT 商品ID FROM 売上

image.png
 ↓ 重複した商品IDは一行にまとめられます。
image.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?