我的存储过程有3个参数,我正在传递(@nameP, @idP, @dateP
)
并将数据插入#myTemp
表中
然后我用
select *
into dbo.realTable
from #myTemp
然后我想基于
dbo.FinalTable
和dateP
过滤掉所有已经存在的数据(在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
子句中。