在代碼中有很多行將被插入,代碼給了我這個錯誤
[23000][2601] 無法在具有唯一索引“IX_Estimates_EstimateNumber”的物件“dbo.Estimates”中插入重復的鍵行。重復的鍵值為 (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;
uj5u.com熱心網友回復:
出現問題是因為select MAX(Number) 1 FROM EstimateNumber在 select 子句中不會像您期望的那樣作業并且總是為每一行回傳相同的值。由于存在唯一索引,因此會阻塞資料插入。您可以執行 select 陳述句來驗證這一點。
您可以使用 aROW_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. 還將客戶從嵌套選擇移動到連接
uj5u.com熱心網友回復:
您可以像這樣使“EstimateNumber”列自動遞增
ALTER TABLE dbo.EstimatesMODIFY COLUMN EstimateNumber INT auto_increment
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/387409.html
標籤:sql sql-server 查询语句 选择 插入
