小编典典

SQL Server中的自定义排序

sql

我有一个表,其中的结果使用“ ORDER”列进行排序,例如:

Doc_Id    Doc_Value   Doc_Order
1         aaa         1
12        xxx         5
2         bbb         12
3         ccc         24

我的问题是最初尽可能高效且可重用地设置此订单列。

我最初的想法是设置一个标量函数,当向表中添加新条目时,它可以用作默认值:

ALTER FUNCTION [dbo].[Documents_Initial_Order] 
( )
RETURNS int
AS
BEGIN

RETURN (SELECT ISNULL(MAX(DOC_ORDER),0) + 1 FROM dbo.Documents)

当用户想要置换2个文档时,我可以轻松地切换2个命令。

它工作得很好,但是我现在有第二张表,我需要以相同的方式进行设置,而且我敢肯定,有一种更好的方法可以做到这一点。任何的想法?


阅读 184

收藏
2021-04-22

共1个答案

小编典典

听起来好像您想要一个Identity列,一旦它获得初始值,就可以覆盖它。一种解决方案是拥有两列,一次称为“
InitialOrder”,即一个自动递增的身份列,然后是第二个名为doc_order的列,该列最初设置为与InitialOrder字段相同的值(甚至可能是插入触发器或存储过程(如果您这样做的话),但是可以让用户编辑该列。

每条记录确实需要额外的几个字节,但是可以解决您的问题,并且如果它根本没有任何价值,那么您将同时拥有初始文档顺序和用户重置顺序。

另外,我不确定您的doc_order是否需要唯一,但如果不是,则可以按doc_order和InitialOrder对返回值进行排序,以确保返回顺序一致。

2021-04-22