使用临时表和实际表在存储过程中更新语句

问题描述 投票:0回答:1

我在这里找到了许多其他关于如何执行此操作的帖子,但不确定如何编写用于检查系统名称和更新语句的初始选择语句,因为涉及临时表。 我对使用存储过程非常陌生,更不用说临时表了,所以我不知所措。 据我了解,正在发生的情况是数据通过 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
sql-server-2005 stored-procedures insert
1个回答
1
投票

您只需尝试运行

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] 不在这两个值中时要做什么。

© www.soinside.com 2019 - 2024. All rights reserved.