Sql server 2008 基于另一列的SQL标识列
有没有办法在另一列上定义标识列?我想要完成的是一个表格,其中包含订单的位置,并且这些订单可以随时放在那里。因此,表中可能已经有三个位置,看起来有点像这样:Sql server 2008 基于另一列的SQL标识列,sql-server-2008,identity,identity-column,Sql Server 2008,Identity,Identity Column,有没有办法在另一列上定义标识列?我想要完成的是一个表格,其中包含订单的位置,并且这些订单可以随时放在那里。因此,表中可能已经有三个位置,看起来有点像这样: OrderNumber | OrderPosition 10001 1 10001 2 10001 3 现在我想添加另一个位置,而不计算OrderPosition列的正确值。这是因为我希望将多个订单的新位置写入表中,并希望避免对单个订单进行光标操作。我更喜欢OrderPosition是基于Or
OrderNumber | OrderPosition
10001 1
10001 2
10001 3
现在我想添加另一个位置,而不计算OrderPosition列的正确值。这是因为我希望将多个订单的新位置写入表中,并希望避免对单个订单进行光标操作。我更喜欢OrderPosition是基于OrderNumber列重新设定种子的标识列的解决方案。因此,如果我为一个新订单添加一个订单位置,它将以1开始,如果我为订单10001添加另一个位置,它将以4继续。编写一个标量函数,该函数基于OrderNumber返回最大值(OrderPosition)。然后在insert订单声明中引用该函数您的需求将不适用于标识列 您需要创建自定义逻辑以从普通列中获取,并基于将生成的新no的组合。。like(阅读注释,仅选择一种逻辑)
如果我为同一顺序插入两个新位置,这不会导致错误吗?因为第一行的插入不会提交,并且函数将为两行返回相同的结果。简短的回答是肯定的,这是可能的。可能性是什么:这取决于两个插入是否在同一事务中。同时访问同一订单所处理的订单数量。不幸的是,我很可能会在一个批次中为一个订单插入多个位置。我认为解决方案是在函数的返回值中添加一个行号。我来试试。这就成功了。是否要更新答案以包含行号?那我就把它标记为正确的。谢谢,但这些都是迭代逻辑,不是吗?我必须迭代所有订单号。我需要避免这种情况。还是我遗漏了什么?“迭代所有订单号”的意思是。。在您的问题中,您写道“如果我添加订单位置”,我的回答基于此。。你还需要什么。。。您是否要插入或更新记录..用示例解释..我还写道“这是因为我想将多个订单的新位置写入表中,并且希望避免对单个订单进行游标。”。我认为给出的第一个答案已经解决了我的问题。无论如何,谢谢你。亲爱的,我在直接询问中写的同样的东西。。。根据当前插入订单编号…case语句给出最大值。。我不太懂你的英语,请告诉我你想要什么。在插入或更新现有表格中。您好,您能发布您的解决方案吗?作为编辑或单独的答案?
declare @t table(OrderNumber int, OrderPosition int)
insert into @t values (10001, 1),(10001, 2),(10001, 3),(10001, 4)
select * from @t
--now insert new record with old orderno
declare @seq int = 1
declare @ordernumberNew int = 10001
--Eigher you can use :- insert to more understand
if( exists(select orderposition from @t where OrderNumber = @ordernumberNew ))
begin
set @seq = (select max(OrderPosition) + 1 from @t where OrderNumber = @ordernumberNew )
end
insert into @t values (@ordernumberNew , @seq )
select * from @t
--or another twist of above statement, insert directly as
insert into @t
values
(
@ordernumberNew,
case when exists (select orderposition from @t where OrderNumber = @ordernumberNew )
then (select max(OrderPosition) + 1 from @t where OrderNumber = @ordernumberNew )
else 1 end
)
select * from @t
--Now enter the not exist order no
set @ordernumberNew = 10006
insert into @t
values
(
@ordernumberNew,
case when exists (select orderposition from @t where OrderNumber = @ordernumberNew )
then (select max(OrderPosition) + 1 from @t where OrderNumber = @ordernumberNew )
else 1 end
)
select * from @t