使用MS-SQL,我有一个INSERT ... SELECT
语句,用于填充具有IGNORE_DUP_KEY = ON
唯一键的表。
是否有简单方式我可以获取被丢弃的行,因为它们是重复的? (最好在声明完成后)
答案 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语句。