从 select in SQL 中增加插入的数字

Increase number into insert from select in SQL

在代码中有很多行将被插入并且代码给我这个错误

[23000][2601] Cannot insert duplicate key row in object 'dbo.Estimates' with unique index 'IX_Estimates_EstimateNumber'. The duplicate key value is (10005)

代码:

INSERT INTO dbo.Estimates (EstimateNumber, Date, Comments, CustomerId)
    SELECT
        (SELECT MAX(Number) + 1 FROM EstimateNumber),
        po.DateReceived,
        po.Notes,
        (SELECT Id FROM Customers WHERE Name = po.Customer)
    FROM
        staging.PricingTable po
    LEFT JOIN
        dbo.Estimates Es ON Es.Date = po.DateReceived
    WHERE 
        Es.Date IS NULL;

出现此问题是因为 select 子句中的 select MAX(Number)+1 FROM EstimateNumber 不会按您预期的那样工作,并且总是 return 每行的值相同。既然有唯一索引,就会阻塞数据的插入。您可以执行 select 语句来验证这一点。

您可以使用 ROW_NUMBER() 来解决这个问题。

示例 sql 代码如下:

declare @maxval integer ;
select @maxval =  max(Number) from EstimateNumber ;

insert into dbo.Estimates ( EstimateNumber, Date,Comments, CustomerId )
select  @maxval + ROW_NUMBER() OVER (ORDER BY c.Id), po.DateReceived, po.Notes, c.Id
from staging.PricingTable po
join Customers c on c.Name = po.Customer
left join dbo.Estimates Es on Es.Date = po.DateReceived
where Es.Date is null;

这里我使用了一个局部变量来保存 max(Number) 并使用 row_number 递增它。还将 Cutomers 从 nested-select 移动到 join