カーソルを使用してテーブルの1つのフィールドを更新していますが、選択のテキストにORDER BY
を使用してカーソルを宣言しようとしています。READ ONLYカーソルでFOR UPDATEを指定することはできません
testTable:
RecordGuid RecordID DupeParentID
---------- -------- ------------
[guid] A Y
[guid] A N
[guid] A N
[guid] A N
[guid] B Y
[guid] B N
[guid] B N
[guid] C Y
[guid] C N
[guid] C N
、スクリプト:
DECLARE @allcounter INT
SET @allcounter = 1
SELECT RecordID, count(*) as [NumberDupes]
INTO #RecordGroupCounts
FROM testTable
GROUP BY RecordID
DECLARE @temp VARCHAR(500)
DECLARE @current VARCHAR(500)
DECLARE c1 CURSOR
FOR
SELECT RecordID FROM testTable WHERE RecordID IN (SELECT RecordID FROM testTable WHERE DupeParentID = 'Y')
ORDER BY RecordID
FOR UPDATE OF RecordID
OPEN c1
FETCH NEXT FROM c1 INTO @current
FETCH NEXT FROM c1 INTO @current
WHILE @@fetch_status = 0
BEGIN
UPDATE testTable
SET RecordID = RecordID + '-' + cast(@allcounter AS VARCHAR)
WHERE CURRENT OF c1
IF (@allcounter + 1) = (SELECT [NumberDupes] FROM #RecordGroupCounts WHERE RecordID = @current)
BEGIN
FETCH NEXT FROM c1 INTO @current
SET @allcounter = 0
END
SET @allcounter = @allcounter + 1
FETCH NEXT FROM c1 INTO @current
END
CLOSE c1
DEALLOCATE c1
本の全ての所望の出力は次のとおりです。私が働いている
RecordGuid RecordID DupeParentID
---------- -------- ------------
[guid] A Y
[guid] A-1 N
[guid] A-2 N
[guid] A-3 N
[guid] B Y
[guid] B-1 N
[guid] B-2 N
[guid] C Y
[guid] C-1 N
[guid] C-2 N
私は、次の例のデータを持っていますSQL Server 2000では、ROW_NUMBER()
は利用できません。これを行う一般的な方法はループであることはわかっていますが、私はいいえ、DBAを意味します。これはカーソルの宣言で私のORDER BY RecordID
を削除すると現在動作します。
私の現在のテストテーブルと同じくらい小さくても問題ありませんが、これを注文しようとしているのは、RecordIDが順序どおりでないとかなり壊れてしまうということですRecordID ASC, DupeParentID DESC
)、これをもっと大規模なレコードセットで半定期的に使用する予定です。更新するカーソルの順序を定義する方法はありますか?何とか自動的にカーソルが並んでいますか?そうでない場合は、SQL Server 2000用のこれを書くための簡単な(または速い)方法がありますか?
私はrecord_idで注文の不足がこれを壊すかどうかわかりません。重複が-1 -2 -3等と印されているように見えるが、少し恣意的である。これを書くためのより速い方法は、ループの欠如であり、それを基にしたものに変えますが、それは難しいかもしれません。完全な副作用として、c1カーソルの母集団は、RecordIDからFRET testTable WHERE DupeParentID = 'Y'グループをrecordIDで選択する(グループは重複を排除します。 – Twelfth
@Tewlfth - 現在(注文の順序で)、指定されたエラーメッセージが表示されます。それがなければ、いくつかのテストの後に実行されますが、カーソルがデータをまったく順序付けしていないように見えるので、私のカウンタは不正な数のレコードを更新します( 'A、A-1、 C-3、A、C-1、C-2 '、...)。'DupeParentID = 'Y''に関しては、' DupeParentID =' Y''(カーソル自体のために)のRecordIDを持つすべてのレコードが必要です - 'Y'レコードだけでなく、それらのすべてがRecordIDと一致するY. –
これに答えるために他の誰かが走ることを期待していました...非ユニークなデータとカーソルの組み合わせはかなり残酷です。私はこれについて別の角度を試してもよろしいですか?私が間違っている場合は私を訂正してください。しかし、現在あなたはテーブルにデータを持っています。このスクリプトはワンタイム修正(IE、あなたは進行中のプロダクトでこのロジックを使うつもりはありません)として使用されています...ケース、私はあなたにこれを処理するための別のアイデアを持っています。 'testable'の中にあるものは、3つのrecordID、Dupeparent_id、Nを区別するために、あるいは実際には3つの同一のレコードをここに番号付けしていますか? – Twelfth