質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Q&A

解決済

1回答

2337閲覧

動的カーソルについて

sa.

総合スコア13

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

0グッド

0クリップ

投稿2019/01/15 05:58

前提・実現したいこと

ストアドで動的カーソルを使用し、レコードの更新をしたい

発生している問題・エラーメッセージ

16929:カーソルは読み取り専用です。のエラー発生

該当のソースコード

DECLARE @SQL varchar(max);

BEGIN TRY
SET @SQL = N'';
SET @SQL = @SQL + N' SELECT A.CODE,';
SET @SQL = @SQL + N' A.NAME,';
SET @SQL = @SQL + N' B.GROUP';
SET @SQL = @SQL + N' FROM A,';
SET @SQL = @SQL + N' B';
SET @SQL = @SQL + N' WHERE B.GROUP = ' + CONVERT(varchar,12345);
SET @SQL = @SQL + N' AND A.CODE = B.CODE';

SET @SQL = @SQL + N' ORDER BY'; SET @SQL = @SQL + N' A.CODE,'; SET @SQL = @SQL + N' A.NAME,'; SET @SQL = @SQL + N' B.GROUP'; SET @SQL = @SQL + N' FOR UPDATE OF'; SET @SQL = @SQL + N' A.No,'; SET @SQL = @SQL + N' A.RowNo'; EXECUTE (' DECLARE C_TEST CURSOR FOR ' + @SQL); OPEN C_TEST; FETCH NEXT FROM C_TEST INTO @REC_CODE, @REC_NAME, @REC_GROUP; WHILE @@FETCH_STATUS = 0 BEGIN UPDATE SET No = 1, RowNo = 1 WHERE CURRENT OF C_TEST; FETCH NEXT FROM C_TEST INTO @REC_CODE, @REC_NAME, @REC_GROUP; END --カーソルクローズ CLOSE C_TEST; DEALLOCATE C_TEST; END TRY

試したこと

動的カーソルを使用し、AテーブルのNoとRowNoを更新したいのですが
Update ~ WHERE CURRENT OF C_TESTの部分で「16929:カーソルは読み取り専用です。」のエラーが発生してしまいます。
ただ、ORDER BY句を外して実行すると更新は可能です。

どのような書き方をすればOrderByしたカーソルの内容を更新することが出来るのでしょうか?
SQLServer初心者です。どなたかご教授ください。
よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

SQLServer2017
ストアド

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2019/01/15 08:38

noとrownoにセットするのは実際には可変でしょうか? (そうでないとFECH LOOPする意味はないので)
sa.

2019/01/16 00:52

明記せずに申し訳ございません。 実際には可変です。 なかなか自分では解決できず、困っています。 よろしくお願いいたします。
guest

回答1

0

ベストアンサー

カーソルが読み取り専用のようですね。
テーブルを直接更新するように変更してみて下さい。

UPDATE A SET No=1, RowNo=1 WHERE [Aのキー項目]=[キー値]

投稿2019/01/16 01:18

sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sa.

2019/01/16 02:47

カーソル上で並べ替えを行って、1件ずつ連番を振りたいと思っています。 また、単純な1からの連番ではないため可変としています。 ORDER BY句を付けなければ、読取専用とならずに更新してくれます。 説明が足りなくすみません。。。
sazi

2019/01/16 02:51

カーソルの内容が一意に識別できないのでしょう。 なので、order byすると特定できなくなるという事だと思います。 そのぞれのテーブルの一意キーは何ですか?
sa.

2019/01/16 04:41

ありがとうございます!! 解決しました。 テーブルを移行してきたのですが、主キーが移行できていなかったのが原因でした。 主キーを作成し実行したら上手く更新できました。 お時間をとって頂き、ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問