Help us understand the problem. What is going on with this article?

T-SQL ユーザー定義関数、エラー処理 他

T-SQL

変数

DECLARE @変数名 型名
SET @変数名 = 代入値

または

SELECT @変数名 = 代入値

DECLARE 
   @変数名1 型名
   @変数名2 型名
SELECT
   @変数名1 = 代入値
,          @変数名2 = 代入値

テーブル変数

・実行時のみメモリ上に存在する仮想テーブル
・通常の変数同様に処理完了時に自動的に廃棄されるため、データの削除処理やテーブル自体の削除処理は不要
・大量のデータを挿入するとその分メモリを消費するが、高速に処理できる

DECLARE @変数名 table {
  列名1 型名 オプション
, 列名2 型名 オプション
}

主キーの設定

DECLARE @変数名 table
  列名1 型名 オプション
, 列名2 型名 オプション
, PRIMARY KEY
, 主キー
  )

INSERT INTO @変数名 VALUES ( 値1, 値2, 値3)
INSERT INTO @変数名 VALUES ( 値1, 値2, 値3)

UPDATE @変数名
SET カラム名 = 代入値
FROM @変数名
WHERE(条件)

一時テーブル

・変数ではなく本物のテーブルが一時的に作られる
・セッションが有効な間は削除されない(エディタを閉じるまで有効)
・処理は低速だが大量のデータを一時的に扱う場合は効果的

CREATE TABLE #テーブル名 {
列名1 型名 オプショ
, 列名2 型名 オプション
}

エラー処理
・TRYの部分に実行したい処理を書く
→ もしその中でエラーがあったらCATCHに移動
CATCHにはエラーが起きた場合の処理を書く

BEGIN TRY
  処理
END TRY
BEGIN CATCH
 エラー処理
END CATCH

TRANSACTION ✖️ TRY CATCH の組み合わせ

BEGIN  TRY
    BEGIN TRANSACTION
  -- 処理
    COMMIT TRANSACTION
END TRY
BEGIN  CATCH
  ROLLBACK TRANSACTION
 -- エラー処理
END  CATCH
#ユーザー定義関数 
CREATE  FUNCTION  関数名
  @引数1 データ型
,   @引数2 データ型

RETURNS 戻り値 データ型
AS
BEGIN
  処理
  RETURN 戻り値
END
GO

以下、お店の商品ごとに割引するという処理
idと金額を入れたら割引後の値段を出してくれるfnc_calc_discountという関数を作ります。
例:id1番は10%引きです。

テーブル作成などの処理は省略します。

CREATE FUNCTION [dbo].[fnc_calc_discount](
  @p_id int
, @p_price money
)
RETURNS money
AS
BEGIN
DECLARE
   @w_money money
 , @w_discount_rate money

SELECT
 @w_discount_rate = campaign_discount.discount
FROM campaign_discount
WHERE(campaign_discount = ISNULL(@p_id, ''))

SELECT @w_money = ISNULL(@p_price, 0) * (1 - ISNULL(@w_discount_rate, 0))

RETURN @money

--実行

SELECT dbo.fnc_discount_rate(1, 500)  450
SELECT dbo.fnc_discount_rate(2, 500)  400
SELECT dbo.fnc_discount_rate(3, 500)  350
Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away