プログラミングと日々思ったことなど

ブログ名通りです。仕事でプログラミングをはじめました。

ストアドプロシージャからストアドプロシージャを呼び出す【SqlServer】

昨日は念願の(!)カーソルのあるストアドプロシージャの作成を行いました。
まだ未完成ですが、復習でコードを載せます。

USE testdb
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE testpro(
		@aaa VARCHAR(20)
		)
AS
	DECLARE @returnval int --戻り値
	DECLARE @SQL NVARCHAR(4000)
	DECLARE @lMsg(4000)

	--カーソルデータ格納変数
	DECLARE @kakunou VARCHAR(1000)

BEGIN
	BEGIN TRY
	SET @returnval = 1

	SET @lMsg = @aaa + 'のデータ移行を開始しました。'
	EXECUTE testbl '案内','',@aaa,0,@lMsg

	IF (@aaa IS NULL OR @aaa = '')
	BEGIN
		SET @lMsg = '引数が未設定'
		EXECUTE testbl 'エラー','',@aaa,1,@lMsg
		RETURN @returnval
	END

	--カーソル作成
	SET @SQL = 'DECLARE abc CUSOR FOR SELECT tosi From'
				+'(SELECT name From' + @aaa + ' .table) AS T'

	EXECUTE sp_executesql @SQL

	--カーソルオープン
	OPEN abc
	--abcから変数@kakunouに1件ずつデータを格納する
	FETCH NEXT FROM abc INTO @kakunou

	IF @@FETCH_STATUS <> 0
	BEGIN
		SET @lMsg ='テーブルが存在しません'
		EXECUTE testbl 'エラー','',@aaa,1,@lMsg
		RETURN @returnval
	END

	While @@FETCH_STATUS = 0
	BEGIN
		EXECUTE abcInsertpro @aaa,@kakunou
    #処理の後、FETCHで再び1行データを取得する
		FETCH NEXT From abc INTO @kakunou
	END

  CLOSE abc
       DEALLOCATE abc

        SET @lMsg = @aaa + 'のデータ移行を完了しました。'
	EXECUTE testbl '案内','',@aaa,0,@lMsg


	END TRY

	--例外エラー
	BEGIN CATCH
		SET @lMsg = '[ERROR_NUMBER]' + @SQL
		EXECUTE testbl 'エラー','',@aaa,1,@lMsg
		RETURN @returnval
	END CATCH
	SET returnval = 0
END

GO

@@FETCH_STATUSの設定がおかしいかな?
自分でもわかるように、土日で説明を書くつもりです。

...6月4日追加
データ以降が完了したことを判断する処理は、書かなくても良い(正常に処理されれば、下に流れていくため)


ここから雑記

金曜日に、映画「美しい星」という三島由紀夫原作のSF映画を見ました。
人間は人間自身を自然の一部だと思っていない...だったかな?
個人的にとても面白かったです。