Я использую курсор для обновления одного поля в таблице, и я пытаюсь объявить курсор, используя ORDER BY
в тексте выбора.
У меня есть следующие примеры данных:
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()
- я знаю, что общий способ сделать это с помощью циклов, но я ни в коем случае не администратор баз данных, и в настоящее время это работает, если я удаляю my ORDER BY RecordID
в объявлении курсора.
Несмотря на то, что моя текущая таблица тестов настолько мала, кажется, что она работает нормально, но причина, по которой я пытаюсь это упорядочить, заключается в том, что я вполне уверен, что она сломается, если RecordIDs не в порядке ( RecordID ASC, DupeParentID DESC
) и я намерен использовать это на гораздо большем наборе записей полурегулярно. Есть ли способ определить порядок обновления курсора? Курсор как-то упорядочен автоматически? Если нет, есть ли более простой (или более быстрый) способ написать это для SQL Server 2000?