обновить оператор в хранимой процедуре, используя временную таблицу и реальную таблицу - PullRequest
0 голосов
/ 29 июля 2011

Я нашел здесь много других сообщений о том, как это сделать, но не уверен, как написать начальный оператор выбора, который проверяет имя системы и оператор обновления, так как там задействована временная таблица. Я очень хорошо работаю с хранимыми процедурами, не говоря уже о временных таблицах, поэтому я в растерянности Я понимаю, что происходит то, что данные поступают на SP через канал XML (этот шаг здесь не показан). Данные из фида xml затем сохраняются во временной таблице. Поскольку 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

1 Ответ

1 голос
/ 29 июля 2011

Вы можете сохранить один запрос, просто попытавшись запустить 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 или[статус] не в этих двух значениях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...