INSERT SELECT和IGNORE_DUP_KEY,如何检索丢弃的行?

时间:2013-11-20 19:50:54

标签: sql sql-server sql-server-2005 sql-server-2012

使用MS-SQL,我有一个INSERT ... SELECT语句,用于填充具有IGNORE_DUP_KEY = ON唯一键的表。

是否有简单方式我可以获取被丢弃的行,因为它们是重复的? (最好在声明完成后)

1 个答案:

答案 0 :(得分:1)

OUTPUT clause是关键所在。

create table dbo.IDKsource ( 
    SNumber int not null, 
    SText varchar(100) not null  
) ;
go
insert into dbo.IDKsource 
values ( 1, 'aaaaa' ), ( 2, 'bbbbb' ), ( 1, 'cccccc' ), ( 3, 'dddddd' ) ;
go

create table dbo.IDKOntarget ( 
    SNumber int not null unique with ( ignore_dup_key = on ), 
    SText varchar(100) not null
) ;
go

-- The following lines must all be in one batch!
declare @RecordsWereInserted table (
    SNumber int not null , 
    SText varchar(100) not null
) ;

insert into dbo.IDKOntarget ( SNumber , SText )
output inserted.* into @RecordsWereInserted 
select SNumber , SText 
from dbo.IDKSource ;

select SNumber , SText 
from dbo.IDKsource 
except 
select SNumber , SText 
from @RecordsWereInserted ;

如果要保留插入的数据超过一个批处理(或者您的SQL Server版本不支持表变量),请将我的表变量RecordsWereInserted替换为实际表。

注意:我的第一种方法是直接使用EXCEPT的INSERT语句,但SQL Server不允许使用带有EXCEPT,INTERSECT或UNION的DML语句。