SQL:在上一行的基础上插入新的唯一行

时间:2018-06-22 13:40:41

标签: sql sql-server erp

我正在使用Deltek Vision ERP软件来尝试创建自定义解决方案,以提供项目的可交付成果列表。我已经在Vision的Project区域中创建了一个自定义网格,该网格具有如下所示的SQL表:

SELECT TOP (1000) [WBS1]
      ,[WBS2]
      ,[WBS3]
      ,[Seq]
      ,[CreateUser]
      ,[CreateDate]
      ,[ModUser]
      ,[ModDate]
      ,[CustDeliverables]
      ,[CustDueDate]
      ,[CustCompletionDate]
  FROM [Vision_Prod].[dbo].[Projects_Deliverables]

该表具有三个用户输入的字段,它们是上面列出的最后三列。

我要完成的工作是将可交付成果设置在WBS2级别,并且将其汇总到WBS1,因此基本上需要发生的是,只要在WBS2中创建具有值的记录,该记录就会重复,但是重复项具有WBS2中没有值。

我已经在Vision中设置了工作流程,以便当某人在某个阶段将可交付成果输入网格时,它将启动存储过程来完成此任务。问题是Seq字段。这是创建记录时系统分配的唯一标识符。当我的存储过程触发时,我收到一个错误,该序列必须包含在记录中。

这是我正在使用的存储过程:

INSERT INTO [Vision_Prod].[dbo].[Projects_Deliverables] (WBS1, WBS2, WBS3, Seq, CreateUser, ModUser, ModDate, CreateDate, CustDueDate, CustCompletionDate)

        SELECT WBS1, '', '', (NEXT VALUE FOR Seq), CreateUser, ModUser, ModDate, CreateDate, CustDueDate, CustCompletionDate 
        FROM Projects_Deliverables
        WHERE Projects_Deliverables.WBS2 IS NOT Null and Projects_Deliverables.WBS1 = @WBS1

如果有人可以帮助我弄清楚如何以这种方式创建记录时如何让系统分配新序列,将不胜感激。

2 个答案:

答案 0 :(得分:0)

您可以使用VALUES创建一个虚拟表,以创建多余的行,然后在不需要时进行调整。这样的东西(但未经测试):

SELECT TOP (1000) 
  [WBS1]
  ,CASE c WHEN 2 THEN NULL ELSE [WBS2] END AS [WBS2] 
  ,[WBS3]
  ,[Seq]
  ,[CreateUser]
  ,[CreateDate]
  ,[ModUser]
  ,[ModDate]
  ,[CustDeliverables]
  ,[CustDueDate]
  ,[CustCompletionDate]
FROM [Vision_Prod].[dbo].[Projects_Deliverables]
CROSS JOIN (VALUES (1), (2)) t(c)
WHERE (WBS2 IS NULL AND c < 2)
  OR WBS2 IS NOT NULL

答案 1 :(得分:0)

这是解决方案:

REPLACE(CAST(NEWID() AS VARCHAR(36)), '-', '')