我试图使用T-SQL的MERGE语句插入许多记录,但是当源表中有重复记录时,我的查询无法插入。如何避免在使用T-SQL合并语句时插入重复记录
- 目标表有一个主键基于两列
- 源表可能包含违反目标表的主键约束(“PRIMARY KEY约束冲突”重复记录的是:失败是造成抛出)
我正在寻找一种方法来更改我的MERGE语句,以便它可以忽略源表中的重复记录和/或将尝试/捕获INSERT语句来捕获可能发生的异常(即所有其他INSERT语句将运行,而不管可能发生的少量坏蛋) - 或者,也许有更好的方法o解决这个问题?
下面是我试图解释的一个查询示例。下面的例子将增加10万点的记录到一个临时表,然后将尝试插入到目标表中的记录 -
编辑 在我原来的职位,我只包括在让路的例子表到两个领域SO朋友提供DISTINCT解决方案以避免MERGE语句中出现重复。我应该提到,在我现实世界的问题中,表格有15个字段,其中有15个字段是两个字段是一个CLUSTERED PRIMARY KEY。所以DISTINCT关键字不起作用,因为我需要选择所有15个字段并忽略基于两个字段的重复项。
我已更新下面的查询以包含一个字段col4。我需要将col4包含在MERGE中,但我只需确保只有col2和col3是唯一的。
-- Create the source table
CREATE TABLE #tmp (
col2 datetime NOT NULL,
col3 int NOT NULL,
col4 int
)
GO
-- Add a bunch of test data to the source table
-- For testing purposes, allow duplicate records to be added to this table
DECLARE @loopCount int = 100000
DECLARE @loopCounter int = 0
DECLARE @randDateOffset int
DECLARE @col2 datetime
DECLARE @col3 int
DECLARE @col4 int
WHILE (@loopCounter) < @loopCount
BEGIN
SET @randDateOffset = RAND() * 100000
SET @col2 = DATEADD(MI,@randDateOffset,GETDATE())
SET @col3 = RAND() * 1000
SET @col4 = RAND() * 10
INSERT INTO #tmp
(col2,col3,col4)
VALUES
(@col2,@col3,@col4);
SET @loopCounter = @loopCounter + 1
END
-- Insert the source data into the target table
-- How do we make sure we don't attempt to INSERT a duplicate record? Or how can we
-- catch exceptions? Or?
MERGE INTO dbo.tbl1 AS tbl
USING (SELECT * FROM #tmp) AS src
ON (tbl.col2 = src.col2 AND tbl.col3 = src.col3)
WHEN NOT MATCHED THEN
INSERT (col2,col3,col4)
VALUES (src.col2,src.col3,src.col4);
GO
您必须决定在#tmp中有col2和col3重复的时候应该选择哪一行。例如,您可以使用'group by col2,col3'和'min(col4)col4'。 –