我已经编写了一个存储过程,如果存在记录将进行更新,否则它将进行插入.它看起来像这样:
update myTable set Col1=@col1, Col2=@col2 where ID=@ID
if @@rowcount = 0
insert into myTable (Col1, Col2) values (@col1, @col2)
Run Code Online (Sandbox Code Playgroud)
我以这种方式编写它的逻辑是更新将使用where子句执行隐式选择,如果返回0,则插入将发生.
这样做的替代方法是进行选择,然后根据返回的行数进行更新或插入.我认为这是低效的,因为如果要进行更新,将导致2次选择(第一次显式选择调用,第二次隐式更新位置).如果proc要进行插入,那么效率就没有差别.
我的逻辑声音在这里吗?这是如何将插入和更新组合到存储过程中的?
更新:
我的不好......我在那些桌子上有一个主键......我的意思是目前没有进一步的索引.在看到性能之后我们可能会在将来看到它,并且由于我们在检索数据时对数据有太多过滤器,因此上次我们运行数据库调优时索引没有显示出太大的改进.
数百万条记录中有4张巨大的表格.现在存在经常调用的存储过程并更新这些表.这是场景 -
现在,如果今天存在条目,我需要今天更新它,否则如果用户没有输入,我需要继续为用户插入条目.现在有两种方法可以执行这些,因为只有一个proc可以执行此操作 -
第一道 -
IF EXISTS(TABLE1)
--UPDATE where condn
ELSE
--INSERT
IF EXISTS(TABLE2)
--UPDATE where condn
ELSE
--INSERT
IF EXISTS(TABLE3)
--UPDATE where condn
ELSE
--INSERT
IF EXISTS(TABLE4)
--UPDATE where condn
ELSE
--INSERT
Run Code Online (Sandbox Code Playgroud)
第二种方式 -
DELETE from TABLE1 where condn
DELETE from TABLE2 where condn
DELETE from TABLE3 where condn
DELETE from TABLE4 where condn
INSERT TABLE1 ENTRY
INSERT TABLE2 ENTRY
INSERT TABLE3 ENTRY
INSERT TABLE4 ENTRY
Run Code Online (Sandbox Code Playgroud)
现在第二种方式看起来更简单,但可能更耗时......我不确定哪种方式最好.任何人都可以帮助或指导我在这里..谢谢!
我正在浏览我们的代码库并看到很多像这样的测试:
declare @row_id int = ...
declare @row_attribute string
select
@row_attribute = ROW_ATTRIBUTE
from
SOME_TABLE
where
ROW_ID = @row_id
if @row_attribute is null
begin
... handle not existing condition
end
Run Code Online (Sandbox Code Playgroud)
这是问题,是否可以将if语句中的条件替换为:
if @@rowcount = 0
begin
... handle not existing condition
end
Run Code Online (Sandbox Code Playgroud)
我知道exist函数,但这里的目标是获取行的一些属性并同时检查它的存在.
我必须根据条件将数据从一个表插入另一个表.
1.If Key is found update records
2.If key is not found insert the record.
Run Code Online (Sandbox Code Playgroud)
我使用的是sql server 2005.所以不能使用merge语句.请建议替代方案来实现这一目标