1
我遇到了Insert不存在的问题,而且我不确定MERGE语句是否会更有效或者说我的声明出了什么问题。插入不存在的地方违反PRIMARY KEY
我已经存在查看并需要将此视图的新记录插入表中。
表的样子:
CREATE TABLE [dbo].[ser_number_all]
(Serialnumber nvarchar(100) PRIMARY KEY,
TypeName nvarchar(max),
Date datetime,
Parent_Serialnumber nvarchar(100),
JobNumber nvarchar(30),
ProductNode hierarchyid,
);
INSERT语句如下:
insert into [dbo].[ser_number_all]
(Serialnumber
, TypeName
, Date
, Parent_Serialnumber
, JobNumber
, ProductNode)
select Serialnumber
, TypeName
, Date
, Parent_Serialnumber
, JobNumber
, ProductNode
from dbo.Hierachical_View_with_Jobnumbers as ser_number_all
where not exists (select 1
from Hierachical_View_with_Jobnumbers as hv
where hv. Serialnumber = ser_number_all.Serialnumber
and hv. TypeName = ser_number_all.TypeName
and hv. Date = ser_number_all.Date
and hv. Parent_Serialnumber = ser_number_all.Parent_Serialnumber
and hv. JobNumber = ser_number_all.JobNumber
and hv. ProductNode = ser_number_all.ProductNode);
只要查看还没有任何新的记录,它看起来不错,我没有得到任何错误,输出为0记录,因为它应该是。
当我添加一个新的记录源表和视图有1分以上的记录,我总是收到此错误:
Msg 2627, Level 14, State 1, Line 4
Violation of PRIMARY KEY constraint 'PK__ser_numb__F2753A12C4ABA976'. Cannot insert duplicate key in object 'dbo.ser_number_all'. The duplicate key value is (.x3666AB05).
The statement has been terminated.
我不明白为什么它会插入一个重复的值在主键列中,因为在我的WHERE子句中我看不到任何错误。
我也尝试过使用IS NULL而不是= ser_number_all.TypeName和所有其他列可以有一个NULL值,但仍然是相同的。
同样,我来自甲骨文,看起来我必须学习MS SQL与Oracle相比的多种多样性。
欣赏任何建议:-) THX
编辑:
这里查看的代码:
CREATE VIEW [dbo].[Hierachical_View_with_Jobnumbers]
AS
WITH ProductList
AS
(
SELECT p.Serialnumber,
p.Type_Id,
p.Parent_Serialnumber,
p.ActiveJob_Jobnumber as JobNumber,
N'/' + CONVERT(NVARCHAR(4000), ROW_NUMBER() OVER (ORDER BY p.Serialnumber)) + N'/' AS ProductNode_AsChar
FROM Products AS p
WHERE p.Parent_Serialnumber IS NULL
UNION ALL
SELECT p.Serialnumber,
p.Type_Id,
p.Parent_Serialnumber,
JobNumber,
pl.ProductNode_AsChar + CONVERT(NVARCHAR(4000), ROW_NUMBER() OVER (ORDER BY p.Serialnumber)) + N'/'
FROM Products AS p
INNER JOIN ProductList AS pl ON p.Parent_Serialnumber = pl.Serialnumber
)
SELECT Serialnumber,
pt.Name as TypeName,
Parent_Serialnumber,
JobNumber,
CONVERT(HIERARCHYID, ProductNode_AsChar) AS ProductNode
FROM ProductList as pl
INNER JOIN ProductTypes as pt on pl.Type_Id = pt.Id;
要插入的'[DBO] [ser_number_all]'你是关联'Hierachical_View_with_Jobnumbers' – TheGameiswar
是的,Hierachical_View_with_Jobnumbers是我们获取数据的视图,所有新记录应该插入到表ser_number_all中。 – wayne7215
我在说什么是尝试与视图关联 – TheGameiswar