0
3

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 3 years have passed since last update.

ストアドプロシージャの書き方

Posted at

気分でストアドプロシージャを簡単にまとめます。

参考

【SQL Server】ストアドプロシージャを作成するための基礎知識

[SQL Server のストアドプロシージャを作成する]
(https://sql55.com/t-sql/t-sql-create-stored-procedure-1.php)

CREATE 文

CREATE PROCEDURE [dbo].[TEST_PROC]
AS
BEGIN
    -- 処理
END

IF, WHILEはブロックという概念でBEGIN-ENDで書くことができる。
shellscriptのdo-done的な?
for文はないらしい。

実行方法

EXEC procedure_name [arg1,arg2]

引数の指定で括弧()はいらない。

引数をとる

CREATE PROCEDURE [dbo].[TEST_PROC]
(
    @arg1 VARCHAR(max) ,
    @arg2 INT = 0 ,  ----デフォルト値
    @arg3 DATETIME OUTPUT
)
AS
BEGIN
    -- 処理
END

引数は他の言語みたいに書けて、デフォルト値も設定できる。
OUTPUTはMSの記事を参考に読んでみたけど直感的には理解できない。
OUTPUT パラメータを使用してデータを返す処理

変数

DECLARE @variable VARCHAR(max);みたいな感じで定義する。
SET @variable = 'sample';で代入できる。

CREATE PROCEDURE [dbo].[TEST_PROC]
AS
BEGIN
    DECLARE @foo VARCHAR(max);
    SET @foo = 'fooooooo';
    
    -- @fooに[FOOBAR].[BAR]の値をセットする
    -- [FOOBAR].[BAR]の値がヒットしない場合は@fooはNULLになる
    SELECT
     @foo = BAR
    FROM
     FOOBAR
    WHERE
     HOGE_PIYO = 'Fuga'
    
    -- 別にSELECTだからと言って本当にSELECT文を書く必要はない
    SELECT @foo = 'fuuuuoooo'
END

IF文

if文もBEGIN-ENDで囲む必要がある。

CREATE PROCEDURE [dbo].[TEST_PROC]
(
    @i INT = 0
)
AS
BEGIN
    IF @i = 0
    BEGIN
        --処理
    END
    ELSE
    BEGIN
        --処理
    END
END

また、IF EXISTSも使える。

WHILE文

whileもBEGIN-ENDで書く。

CREATE PROCEDURE [dbo].[TEST_PROC]
(
    @i_Hoge VARCHAR(max)
)
AS
BEGIN
    DECLARE @i BIGINT = 0;
    WHILE @i < LEN(@i_Hoge)
    BEGIN
        --処理
        @i = @i + 1
    END
END

for文がないから変数を使ってfor文みたいにする。
if文でBREAK;CONTINUE;を書いてもいい。

CASE文もあるけどここでは書きません。
SQL Server CASEの使い方 条件分岐を見るか調べてください。

TRY-CATCH

--省略----
AS
BEGIN
    BEGIN TRY
        --処理
    END TRY
    
    BEGIN CATCH
        --処理
    END CATCH
END

例外の発生方法として、
RASERROR();に引数としてERROR_MESSAGE(), ERROR_SEVERITY(), ERROR_STATE()を渡す方法と、
THROW;で出来る。

まとめ

実務でストアドプロシージャを使ってはいないけど、INSERT文を流すときにDECLAREとかを使っていろんなデータを作ったくらい。
知ってて損はないけど、まだ使いどころがわからない。

0
3
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
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?