【发布时间】:2011-12-13 19:52:34
【问题描述】:
我正在使用游标更新表中的单个字段,并且尝试在选择文本中使用 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() - 我知道执行此操作的常用方法是使用循环,但我绝不是 DBA,如果我删除,这目前可以工作我在游标声明中的ORDER BY RecordID。
与我当前的测试表一样小,这似乎工作正常,但我尝试订购它的原因是我相当确定如果 RecordID 不按顺序它会中断(通过RecordID ASC, DupeParentID DESC) 我打算半定期地在更大的记录集上使用它。有没有办法定义更新游标的顺序?光标是否以某种方式自动排序?如果没有,是否有更简单(或更快)的方法来为 SQL Server 2000 编写此代码?
【问题讨论】:
-
我不确定我是否看到 record_id 上缺少 order by 会破坏这一点。尽管看起来将重复项标记为 -1 -2 -3 等的顺序有点随意。更快的编写方法是缺少循环并将其转换为基于集合的东西,但这可能具有挑战性。作为一个完整的旁注,您的 c1 游标的填充可以重做 SELECT RecordID FROM testTable WHERE DupeParentID = 'Y' group by recordID(该组将消除重复项,我怀疑这是您的目标)。跨度>
-
@Tewlfth - 目前(按顺序),我收到指定的错误消息。没有它,经过一些测试,它会运行,但似乎光标根本没有对数据进行排序,因此我的计数器更新了错误数字的记录(我得到了类似
A, A-1, A-2, C-3, A, C-1, C-2...)。至于DupeParentID = 'Y',我需要每条RecordID 为DupeParentID = 'Y'的记录(对于游标本身)——不仅是“Y”记录,而且所有记录都将RecordID 与Y 匹配。 -
希望其他人能够回答这个问题......非唯一数据和光标的混合非常残酷。介意我尝试不同的角度吗?如果我错了,请纠正我,但您目前在表格中有数据,并且此脚本被用作一次性更正(IE,您不打算在正在进行的产品中使用此逻辑)...如果那是这个案子,我确实有另一个想法让你处理。他们是否在“可测试”中区分 3 个记录 ID A Dupeparent_id N,或者您实际上是否有 3 个相同的记录来编号?
-
@Tewlfth 所以事实证明我忘记了一条关键信息 - 有一个主键,其中包含每个记录的唯一标识符(我只是没有包括它,因为它不直接相关我是如何更新的)。我会更新以反映这一点......
-
我的假设对吗?我将组合一个更基于集合的解决方案(有点需要循环,但应该表现得更好。更新部分需要指南(我假设是大整数)......将开始写作
标签: sql sql-server tsql sql-server-2000