昨日は念願の(!)カーソルのあるストアドプロシージャの作成を行いました。
まだ未完成ですが、復習でコードを載せます。
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映画を見ました。
人間は人間自身を自然の一部だと思っていない...だったかな?
個人的にとても面白かったです。