1

我想遍历表格行..通过将 OrderID 设置为 @NUMCOUNT 来重新排序我的“表单选项”...

我希望能够重新排列我的列表的顺序。我需要这样做的原因是因为如果我删除一个表单选项,那么它将出现故障.. 即 (1, 2, 3, 5).. 我会想要 (1, 2, 3, 4).. ETC..

示例表:

ID OrderID FormOption

1 1 姓名

2 3 地址 2

3 2 地址 1

DECLARE @NUMCOUNT int
SET @NUMCOUNT = 0
WHILE (SELECT Count(OrderID) FROM FormOptions WHERE ProductID=1) > @NUMCOUNT
BEGIN
   SET @NUMCOUNT = @NUMCOUNT + 1
   PRINT 'The count is ' + CAST(@NUMCOUNT as char)
   UPDATE FormOptions SET OrderID = @NUMCOUNT WHERE ID=????
END
4

3 回答 3

3

我猜您正在处理需要允许从有序列表中删除并在特定位置插入到有序列表中的东西。删除不需要使订单密集,但可以这样做:

delete from FormOptions
  where OrderId = @SelectedFormOption
update FormOptions
  set OrderId = OrderId - 1
  where OrderId > @SelectedFormOption

您可能希望将其包装在事务中。 (确保您了解交易,因为这非常重要。)

插入类似:

update FormOptions
  set OrderId = OrderId + 1
  where OrderId >= @TargetOrderId
insert into FormOptions
  ( OrderId, ... ) values ( @TargetOrderId, ... )

交换订单头寸可以在一次更新中自动完成:

 update FormOptions
   set OrderId = case when OrderId = @TargetA then @TargetB else @TargetB end
   where OrderId in ( @TargetA, @TargetB )

update可以编写类似的方法将单个表单选项按顺序向上或向下移动一个位置。

于 2013-04-07T02:20:22.263 回答
0

我建议不要使用计数来订购。过去,我有多个列用于根据用户的决定进行排序。

快速解决问题的一个选项是提供 orderID > Max(orderID) 这样您就可以确保每个新项目的 orderID > 高于最大值,而不管列表中的项目数量如何。

然后,您可以拥有一个仅用于排序目的的列,并允许用户设置事物的顺序。

有时更容易(也更好)思考如何改变你正在做的事情,而不是编写代码来做你的想法:)

于 2013-04-07T02:01:55.610 回答
0

我建议单独留下 OrderId,因为@OldProgrammer 已经说过他们仍然会按顺序进行,而且(除非我遗漏了什么)它似乎会增加不必要的开销。

如果您真的想要连续的数字,大概是出于演示目的,那么要么将其推送到表示层,要么创建一个视图来执行类似的操作

SELECT 
    ROW_NUMBER() AS OrderNumber
    , OtherColumn
FROM FormOptions 
ORDER BY OrderID 
于 2013-04-06T22:59:48.503 回答