気分でストアドプロシージャを簡単にまとめます。
参考
【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とかを使っていろんなデータを作ったくらい。
知ってて損はないけど、まだ使いどころがわからない。