ストアドの例
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