ストアドの色々
■引数を生成
・Create句の直後に記述
CREATE PROCEDURE [dbo].spStudy2
@Master NVARCHAR(100)= NULL '引数
,@ReturnValue NVARCHAR(100) OUTPUT '戻り値
AS
■IF文
・ELSE IF句はそもそもない
・IF文内の適用範囲(IFはどこまでか、ELSE IFはどこまでか)はBEGIN-ENDで設定
・IFやELSEの次の処理が1行だけなら、BEGIN,ENDで囲まなくともよい
BEGIN
IF @Master IS NULL
BEGIN
SELECT * FROM EnumMaster
END
ELSE IF (SELECT COUNT(*) FROM EnumMaster WHERE MasterType = @Master ) = 0
BEGIN
PRINT '対象データがありません'
END
ELSE
BEGIN
PRINT @Master
SELECT * FROM EnumMaster WHERE MasterType = @Master
END
END
■WHILE文
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO #MType INSERT INTO #MType SELECT @Counter,@MasterType,@MasterText
END
■ローカル変数宣言
DECLARE @MasterType NVARCHAR(100) = '初期値'
■SELECT結果を変数に格納
SELECT @ReturnValue = UserName FROM wrk WHERE UserId = '11111'
■テーブル型変数
・テーブルの様な変数を定義できる。
DECLARE @TestTable TABLE(
UserId INT NOT NULL,
UserName NVARCHAR(100)
)
普通のテーブルと同じようにSELECTやDELETE、INSERTが可能
■一時テーブル
#一つでローカル一時テーブル
#二つでグローバル一時テーブル
CREATE TABLE #MType(
RowCounts INT PRIMARY KEY,
TypeName NVARCHAR(100)
)
グローバル: CREATE TABLE ##MType(
■実行メッセージを非表示にする
SET NOCOUNT ON
初期化処理として記載されるのが一般的
■カーソル
・カーソルを宣言
DECLARE MasterCursor CURSOR FOR
SELECT MasterType,MasterText FROM EnumMaster
・カーソルをオープン
OPEN MasterCursor
・カーソルを次の行に進め行の値を変数にセットする
FETCH NEXT FROM MasterCursor
INTO @MasterType,@MasterText
・カーソルをループ
@@FETCH_STATUSで現在のFETCH状況を取得できる。
先頭行FETCH前または最終行FETCH後は、-1になる。
それを利用し、WHILEループで0の間回す
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM MasterCursor
INTO @MasterType,@MasterText
END
・カーソルをクローズ
CLOSE MasterCursor
・カーソルを解放
DEALLOCATE MasterCursor
・一連の流れをセットで書くと
DECLARE MasterCursor CURSOR FOR
SELECT MasterType,MasterText FROM EnumMaste
OPEN MasterCursor
FETCH NEXT FROM MasterCursor
INTO @MasterType,@MasterText
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO #MType SELECT @Counter,@MasterType,@MasterText
SET @Counter = @Counter +1
FETCH NEXT FROM MasterCursor INTO @MasterType,@MasterText
END
CLOSE MasterCursor
DEALLOCATE MasterCursor
■例外処理
・BEGIN TRY~END TYRで正常処理を記載
・BEGIN CATCH~END CATCHでエラーじ処理を記載
BEGIN TRY
BEGIN TRAN
INSERT INTO wrk(UserId) VALUES('1')
COMMIT
END TRY
BEGIN CATCH
@ExecuteStatus = @@ERROR
/* トランザクションがある場合、ROLLBACKする */
IF @@TRANCOUNT > 0
ROLLBACK
END CATCH