如何编写查询以对元素进行重新排序

时间:2019-02-19 22:11:11

标签: node.js sql-server stored-procedures

我正在编写一个将按特定顺序列出项目的代码,我想随意对它们进行重新排序。设置实际上并不那么重要,但总而言之,它是具有MSSQL数据库的节点服务器。

为演示起见,可以说我们正在讨论按特定顺序显示的论坛类别。

Id | OrderNumber | Name
------------------------
1  | 1           | Rules
2  | 3           | Off-topic
5  | 2           | General
8  | 4           | Global

我已经处理了前端,可以根据需要对其进行重新排序,而问题是当我按下数据库上的保存按钮时会发生什么情况。

理想情况下,我想以正确的顺序将包含项ID的JavaScript对象发送到将执行存储过程的服务器上的API端点。像这样:

Data = {
    IDs:"5,2,8,1"
}

有没有一种方法可以对一个存储过程进行编程,该存储过程的唯一参数是Ids列表,但是它可以遍历该列表并执行某些操作,我只能将其描述为以下伪代码:

var Order = 1;
foreach ID in Data.IDs
   UPDATE Categories SET OrderNum = Order WHERE Id = ID
   Order = Order + 1

我最大的问题是我对高级SQL命令不是很熟悉,但这是我唯一需要帮助的部分,我已经处理了其他所有内容。谢谢您的帮助。

1 个答案:

答案 0 :(得分:1)

示例

Declare @IDs varchar(max) = '5,2,8,1'

Update A
   set OrderNumber=B.RetSeq
 From  YourTable A
 Join (
        Select RetSeq = row_number() over (order by (select null))
              ,RetVal = B.n.value('(./text())[1]', 'int')
         From  ( values (cast('<x>' + replace(@IDs,',','</x><x>')+'</x>' as xml) )) A(xmldata)
         Cross Apply xmldata.nodes('x') B(n)
      ) B on A.ID=B.RetVal

更新表

Id  OrderNumber Name
1   4           Rules
2   2           Off-topic
5   1           General
8   3           Global