SQL:根据上一行插入一个新的唯一行

SQL: Insert a new unique row based off previous row

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

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

table 有三个用户输入字段,即上面列出的最后三列。

我想要完成的是在 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

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

您可以使用 VALUES 创建一个虚拟 table 来创建一个额外的行,然后在不需要时过滤掉。像这样的东西(但未经测试):

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

这是解决方案:

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