Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.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 在插入表的视图中迭代_Sql_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

Sql 在插入表的视图中迭代

Sql 在插入表的视图中迭代,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我有一张客户订单表。如果相关发票上存在产品,我需要将其插入采购订单。很多事情都依赖于采购订单表中的数据,所以我所能做的就是构建视图来帮助插入 查看最大值,获取必须随每次插入而递增的字段的MAX()+1 NextSalesOrder FIFOID ChangeID NextPO --------------------------------------------- 102515 300005 26665 1234 我构建了

我有一张客户订单表。如果相关发票上存在产品,我需要将其插入采购订单。很多事情都依赖于采购订单表中的数据,所以我所能做的就是构建视图来帮助插入

查看最大值,获取必须随每次插入而递增的字段的MAX()+1

NextSalesOrder   FIFOID    ChangeID    NextPO   
---------------------------------------------
102515           300005    26665       1234     
我构建了需要插入到采购订单中的产品的另一个视图

Invoice       Product    ChangeID
---------------------------------
102515        105        26665   
102516        144        26665
102517        105        26665
我需要将所有3个值都插入到采购订单表中,但每个值的ChangeID都必须递增。我无法更改表架构

INSERT INTO [Purchase Order] (Invoice, Product, ChangeID)
SELECT TOP(1) T1.Invoice, T1.Product, T2.ChangeID
FROM dbo.[Invoice] T1, dbo.[Maxes] T2
只要我使用TOP(1),上面的代码就可以正常工作,但是我需要一种方法来迭代[Invoice]视图的所有记录,同时增加ChangeID

我看到了两种实现我需要的方法

  • 将视图中的TOP(1)插入到采购订单表中,并在视图中迭代,直到插入所有行

  • 更改产品视图,使ChangeID自行递增

  • 我无法将视图转储到临时表中,因为ChangeID不会递增,所以需要通过Top(1)进行迭代(除非有人知道如何做)

    我被困在这里,目前正在多次调用该过程,以便插入所有行,任何建议都将非常有用


    谢谢。

    您可以使用排名函数对行进行排名,并在查询中使用它。如果发票视图中已有
    ChangeId
    ,则无需使用Maxes视图进行另一次连接

    INSERT INTO [Purchase Order] (Invoice, Product, ChangeID)
    SELECT Invoice
          ,Product
          ,ROW_NUMBER() OVER(PARTITION BY ChangeID ORDER BY ChangeID) + ChangeId - 1
    FROM dbo.[Invoice]
    
    这部分
    ROW_NUMBER()(按ChangeID划分,按ChangeID排序)+ChangeID-1
    为每个
    ChangeID
    提供一个行号,然后将其添加到ChangeID,并从结果中减去1


    样本使用

    DECLARE @tbl TABLE (Invoice INT,       Product INT,    ChangeID INT)
    
    INSERT @tbl
    SELECT 102515,        105  ,      26665 UNION ALL 
    SELECT 102516 ,       144 ,       26665 UNION ALL 
    SELECT 102517  ,      105,        26665
    
    SELECT * FROM @tbl
    
    SELECT ROW_NUMBER() OVER(PARTITION BY ChangeID ORDER BY ChangeID) + ChangeId - 1 NewChangeId
           ,ChangeId
    FROM @tbl
    
    输出

    NewChangeId ChangeId
    26665       26665
    26666       26665
    26667       26665
    

    正是我需要的。非常感谢。