从 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
在代码中有很多行将被插入并且代码给我这个错误
[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