违反PRIMARY KEY约束,无法插入重复键(MS SQL Server)

时间:2017-04-17 08:26:37

标签: sql sql-server tsql

我有一张表格如下:

|Bookname|BDate|Description

和Bookname是我的主键 我需要定期读取文件来更新我的表格。我已经写了一个存储过程来更新文件,如下所示:

Create PROCEDURE [dbo].[UpdateMyTable] 
    -- Add the parameters for the stored procedure here
    @SourceTable AS DVTable READONLY
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    MERGE dbo.MyTarget AS T
    USING @SourceTable AS S ON (T.BookName=S.BookName)
    WHEN NOT MATCHED BY Target
    THEN INSERT(BookName,BDate,Description) 
    VALUES(S.BookName,S.BDate,S.Description)
    WHEN MATCHED
    THEN UPDATE SET T.BookName=S.BookName,T.BDate=S.BDate,T.Description=S.Description;

END

有一个问题是文本文件中有一些记录重复了两次,所以merge函数首先插入文件,第二次抛出异常:[违反PRIMARY KEY约束]

我想知道如果第二次找到Bookname,是否有任何方法可以将MERGE设置为忽略它。

2 个答案:

答案 0 :(得分:2)

在合并之前,尝试从基于BDate的表@SourceTable中删除重复记录。以下查询将删除预订日期较短的书名,并保留该书的最高预订日期,以便您拥有唯一的BookName。

;with cte (BookName,BDate,Description,RowNum)AS
(

Select BookName,BDate,Description,Row_number() over(partition by BookName  order by BDate desc)
 from @SourceTable
)
delete from cte where rownum>1

答案 1 :(得分:1)

如果您的source table有两行BookName,而Target table中不存在CTE,则可以使用;WITH temp AS ( SELECT st.* , row_number() over(PARTITION BY st.BookName ORDER BY BookDate desc) as Rn FROM @SourceTable st ) MERGE dbo.MyTarget AS T USING (SELECT * FROM temp t WHERE Rn = 1) AS S ON (T.BookName=S.BookName) ............

var major: Int32 = 0
var minor: Int32 = 0
document.getVersion(majorVersion: &major, minorVersion: &minor)
print("Version: \(major).\(minor)")