Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 基于另一列的SQL标识列_Sql Server 2008_Identity_Identity Column - Fatal编程技术网

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