我有一张表格如下:
|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设置为忽略它。
答案 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)")