我的存储过程有3个参数,我正在传递(@nameP, @idP, @dateP
并将数据插入#myTemp表中

然后我用

 select *
    into dbo.realTable
    from #myTemp


然后我想基于dbo.FinalTabledateP过滤掉所有已经存在的数据(在idP中):

insert into dbo.FinalTable
select * from dbo.realTable
where not exists (select * from dbo.FinalTable
where idP = @idP
and dateP = @dateP)

drop table dbo.realTable


当我执行过程时,数据将追加到表中。问题是,如果我放置相同的idP并针对相同的dateP再次执行它,则它不应插入任何内容,但可以插入。我认为问题可能出在insert into部分。

编辑:

如果我从where子句中删除and dateP = @dateP,这将非常有效)
ps:谢谢大家的回答,即使就我而言,我只是要做上面写的事情,我还是从您的回答中学到了

最佳答案

基本上,您使用了not exists这是绝对正确的。您下次查询的问题是@dateP。如果传递相同的@idP但不同的@dateP,则会创建相同的@idp,因为您针对@idp和@dateP进行了验证。因此,如何保护这一点,请考虑您的业务情景是否重复,如果@idp@idp@datep仅表示重复,则两者均正确,但如果仅@idp,则必须删除从您的@dateP子句中。

09-30 00:01