ストアドの例

ALTER PROCEDURE [dbo].spStudy2

/* 引数はストアド名の後、AS句前に宣言 */

@Master NVARCHAR(100)= NULL

/* OUTPUTを付与した引数は戻り値をアプリに返せる */

,@ReturnValue NVARCHAR(100) OUTPUT

 

AS

/* IF分岐 */

/* ELSEIF句はない。 ELSE IF */

/* 各構文内(IFの適用範囲、ELSE IFの適用範囲)は

BEGIN-ENDで囲む事でその適用範囲を決める */

BEGIN

IF @Master IS NULL

BEGIN

/* PRINT句に記載した内容が結果のメッセージ欄に表示される */

PRINT 'NULLです'

SELECT * FROM EnumMaster

END

ELSE IF (SELECT COUNT(*) FROM EnumMaster

WHERE MasterType = @Master ) = 0

BEGIN

PRINT '対象データがありません'

END

ELSE

BEGIN

/* DEBUG用に引数の内容を表示する例 */

PRINT @Master

SELECT * FROM

EnumMaster

WHERE

MasterType = @Master

END

END

BEGIN

/* ローカル変数の宣言 */

DECLARE @MasterType NVARCHAR(100) = '初期値'

DECLARE @MasterText NVARCHAR(100) = '初期値'

DECLARE @Counter as INT = 0

DECLARE MasterCursor CURSOR FOR

SELECT MasterType,MasterText FROM EnumMaster

 

/* 一次テーブル */

/* #一個でローカル一時テーブル(作成したユーザのみ参照可能) */

/* #2個でグローバル一時テーブル(全ユーザのみ参照可能) */

/* ------------------------------------------------------- */

/* -------------------------------------------------------

Exec(sql)でローカル一時テーブルを作成した場合、同じストアド内で

あってもその一時テーブルを参照できない。(別ユーザとみなされてしまう?)

よって、Execで一時テーブルを使う場合は、#を2個でグローバル一時テーブル

とする必要がある。 */

/* ------------------------------------------------------- */

/* ------------------------------------------------------- */

CREATE TABLE #MType

(

RowCounts INT PRIMARY KEY,

TypeName NVARCHAR(100),

TypeText NVARCHAR(100)

)

/* ストアドにてSQLが実行された際に[X件処理されました] */

/* メッセージを出さなくする。ストアドの初期化処理として*/

/* SET NOCOUNT ONとするのがよくある例*/

SET NOCOUNT ON

 

/* 変数に値をセット */

SET @Counter = 1

/* カーソルのOPEN*/

OPEN MasterCursor

FETCH NEXT FROM MasterCursor

INTO @MasterType,@MasterText

/* 先頭行FETCH前、最終行FETCH後は、FETCH_STATUSが-1 */

WHILE @@FETCH_STATUS = 0

BEGIN

INSERT INTO #MType

SELECT @Counter,@MasterType,@MasterText

SET @Counter = @Counter +1

/* CURSORから取得した値を変数にセット*/

FETCH NEXT FROM MasterCursor

INTO @MasterType,@MasterText

END

/* CURSORのCLOSE */

/* CURSORのメモリからの解放 */

CLOSE MasterCursor

DEALLOCATE MasterCursor

END

BEGIN

DECLARE @ExecuteStatus as Int

/* 例外処理。例外発生時点でCATCHに飛ぶ */

/* TRANSACTIONの開始。例外と絡める */

BEGIN TRY

BEGIN TRAN

INSERT INTO wrk(UserId) VALUES('1')

/* 正常終了自はCOMMIT */

COMMIT

END TRY

/* CATCHの開始 */

BEGIN CATCH

/* ERRORコードは直前の処理結果しか持たない為、 */

/* 即変数に退避する */

SET @ExecuteStatus = @@ERROR

/* トランザクションがある場合、ROLLBACKする */

IF @@TRANCOUNT > 0

ROLLBACK

END CATCH

END

/* SELECT結果を変数にセット */

SELECT @ReturnValue = UserName FROM wrk

WHERE UserId = '11111'

BEGIN

BEGIN TRY

/* テーブル型 */

DECLARE @TestTable TABLE(

UserId INT NOT NULL,

UserName NVARCHAR(100)

)

INSERT INTO @TestTable

SELECT Userid,UserName FROM wrk

END TRY

BEGIN CATCH

SET @ExecuteStatus = @@ERROR

END CATCH

END

/* 一時テーブルが存在すれば削除 */

IF OBJECT_ID(N'tempdb..#MType', N'U') IS NOT NULL

DROP TABLE #MType;

/* 整数値のみReturn可能 */

RETURN @ExecuteStatus