2016-11-11 122 views
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; 
+0

要插入的'[DBO] [ser_number_all]'你是关联'Hierachical_View_with_Jobnumbers' – TheGameiswar

+0

是的,Hierachical_View_with_Jobnumbers是我们获取数据的视图,所有新记录应该插入到表ser_number_all中。 – wayne7215

+0

我在说什么是尝试与视图关联 – TheGameiswar

回答

0

@TheGameiswar

对不起,现在我知道了你意思;-)愚蠢的我...

这里的解决方案离子现在有正确关联作品:

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 hv 
where not exists (select 1 
        from ser_number_all as sna 
        where hv. Serialnumber = sna.Serialnumber); 

谢谢大家的时间和指导我正确的方向:-)

相关问题