我在这里找到了许多其他关于如何执行此操作的帖子,但不确定如何编写用于检查系统名称和更新语句的初始选择语句,因为涉及临时表。 我对使用存储过程非常陌生,更不用说临时表了,所以我不知所措。 据我了解,正在发生的情况是数据通过 XML 源馈送到 SP(该步骤此处未显示)。 然后,来自 xml feed 的数据将存储在临时表中。 由于现在正在编写 SP,SP 会将临时表中的数据插入到真实表中。 我需要添加一个步骤来检查系统名称是否存在,如果存在,则更新它,如果不存在,则插入它。 我需要有关 IF EXISTS select 语句和更新查询的帮助。
这是原始语句,仅包含插入内容。
原声明
insert into si_systemdetail(projectname, systemname, contactsbcuid, sdverifier, systemtype, location, proposedlivedate, status, bkpsa, pripsa,platform)
select
@project, systemname, contactsbcuid, sdverifier,systemtype, location,
proposedlivedate, 'Initial', bkpsa, pripsa, @platform
from @systemInfo
where status in ('Production','Production w/o Appl')
and systemname not in (select systemname from si_systemdetail)
and @project is not null`
更新声明
IF EXISTS (select systemname from si_systemdetail WHERE systemname = (select systemname from @systemInfo where systemname in (select systemname from si_systemdetail) and @project is not null))
BEGIN
-- update query
UPDATE si_systemdetail
SET **I DO NOT KNOW HOW TO WRITE THIS SECTION**
WHERE
systemname IN (select systemname from si_systemdetail)
AND @project is not null
END
ELSE
BEGIN
-- Write your insert query
insert into si_systemdetail(projectname, systemname, contactsbcuid, sdverifier,
systemtype, location, proposedlivedate, status, bkpsa, pripsa, platform)
select
@project, systemname, contactsbcuid, sdverifier,systemtype, location,
proposedlivedate, 'Initial', bkpsa, pripsa, @platform
from @systemInfo
where status in ('Production','Production w/o Appl')
and systemname not in (select systemname from si_systemdetail)
and @project is not null
END
您只需尝试运行
UPDATE
,然后选中 @@ROWCOUNT
,即可保存一个查询。如果是0,你可以尝试INSERT
。在 SQL Server 2008 中,您可以将这种混乱的逻辑替换为 MERGE
。
UPDATE d
SET d.projectname = i.projectname,
d.contactsbcuid = i.contactsbcuid,
-- other columns here
d.[platform] = @platform
FROM
dbo.si_systemdetail AS d
INNER JOIN @systemInfo AS i
ON i.systemname = d.systemname
WHERE
i.[status] IN ('Production', 'Production w/o Appl')
AND @project IS NOT NULL;
IF @@ROWCOUNT = 0
BEGIN
insert into ...
END
不清楚当系统名称匹配但 @project 为 NULL 或 [status] 不在这两个值中时要做什么。