我有一个表,其中结果使用“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个订单。
它运行良好,但我现在有一个第二个表我需要设置相同的方式,我很确定有一个更好的方法来做到这一点。有什么想法吗?
答案 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值,请尝试使用标识列。