SQL Server中的自定义排序

时间:2009-05-11 13:40:33

标签: sql sql-server user-defined-functions

我有一个表,其中结果使用“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个订单。

它运行良好,但我现在有一个第二个表我需要设置相同的方式,我很确定有一个更好的方法来做到这一点。有什么想法吗?

3 个答案:

答案 0 :(得分:3)

根据您的评论,我认为您有一个非常可行的解决方案。您可以通过将其指定为默认值来使其更加用户友好:

alter table documents
  add constraint constraint_name 
  default (dbo.documents_initial_order()) for doc_order

作为替代方法,您可以创建一个更新触发器,在插入后将标识字段复制到doc_order字段:

create trigger Doc_Trigger
on Documents
for insert
as
update d
set d.doc_order = d.doc_id 
from Documents d
inner join inserted i on i.doc_id = d.doc_id

将doc_id定义为标识列的示例:

create table Documents (
    doc_id int identity primary key,
    doc_order int,
    doc_value ntext
)

答案 1 :(得分:1)

听起来你想要一个标识列,一旦获得初始值就可以覆盖它。一种解决方案是拥有两列,一次调用“InitialOrder”,即自动增量标识列,然后是第二列,名为doc_order,最初设置为与InitialOrder字段相同的值(可能甚至作为如果您正在执行插入操作,则插入触发器或存储过程),但允许用户编辑该列。

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

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

答案 2 :(得分:0)

如果无需控制DOC_ORDER值,请尝试使用标识列。