Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 在SQL Server中保存和获取任意排序顺序_Sql Server 2008_Sorting - Fatal编程技术网

Sql server 2008 在SQL Server中保存和获取任意排序顺序

Sql server 2008 在SQL Server中保存和获取任意排序顺序,sql-server-2008,sorting,Sql Server 2008,Sorting,我的客户希望通过拖放对产品进行排序。拖放部分很容易使用javascript 我的问题是如何保存和获取排序顺序 我正在使用.NETC和SQLServer2008 当我移动一个产品并将其放置在一个新位置时,我会得到被移动产品的id,前面的产品和后面的产品。有了这些数据,我想更新产品的排序顺序 我曾考虑添加一个带有位置的字段,但我想我必须在位置发生变化时更新每个项目。我们有一个排序列,但是的,随着情况的变化,我们必须重新索引所有行。您可以通过以足够大的增量分配排序来缓解这一问题,以便在执行此操作之前允

我的客户希望通过拖放对产品进行排序。拖放部分很容易使用javascript

我的问题是如何保存和获取排序顺序

我正在使用.NETC和SQLServer2008

当我移动一个产品并将其放置在一个新位置时,我会得到被移动产品的id,前面的产品和后面的产品。有了这些数据,我想更新产品的排序顺序


我曾考虑添加一个带有位置的字段,但我想我必须在位置发生变化时更新每个项目。

我们有一个排序列,但是的,随着情况的变化,我们必须重新索引所有行。您可以通过以足够大的增量分配排序来缓解这一问题,以便在执行此操作之前允许某种程度的可移动性,例如在10或100年代,但这不是最佳解决方案,我很想看看其他人有什么想法。

一般来说,添加一个额外的位置字段是您唯一可以做的事情,获得真正任意的排序

但是您可以通过几种方式实现它。这里有两种方法是我不久前自己实现的

一,。方法:通过在项目上循环并对每个位置执行Update语句来更新所有位置值

这很容易实现,但由于有很多更新,它不适合很多项和/或大型表。特别是如果您通过Ajax进行操作,并对列表中的每个更改执行完全的重新排序

二,。方法:仅对受影响的行执行智能更新

选择当前排序顺序中的所有项目旧列表通常比UPDATE语句快 迭代新列表中的所有项目,并在相同位置/索引处将每个项目与旧列表中的项目进行比较。如果项目相同,不要做任何事情 如果项目不同,请从旧列表中查找该项目,该列表实际上应该位于该位置,并相应地更新其位置值。此处可能需要一些查找数据结构 这样,您只需执行最小的数据库更新,但您将拥有更复杂的代码


就我个人而言,我会选择第一种方法,直到数据库更新实际上成为性能问题。

如果您可以通过编程方式捕获每个移动,例如使用向上和向下按钮,那么您可以只交换移动行和正在移动行的位置号。确保在最大位置+1处添加新行