2011-07-29 3 views
0

이 작업을 수행하는 방법에 대한 다른 많은 게시물을 발견했지만 시스템 이름과 업데이트 문을 확인하는 초기 select 문을 작성하는 방법을 알지 못합니다. 임시 테이블이 관련되어 있습니다. 나는 저장 프로 시저 (stored procedure)로 작업하기에 매우 초록색이므로 임시 테이블을 사용하지 않아서 손실을 입었다. 내가 이해할 수있는 것은 데이터가 XML 피드를 통해 SP로 공급된다는 것입니다 (이 단계는 여기에 표시되지 않음). 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` 

당신은 단순히 UPDATE를 실행하려고하면 다음 @@ROWCOUNT을 확인하여 하나 개의 쿼리를 저장할 수 있습니다

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

검색어를 어떻게 읽나요? 들여 쓰기, 캐리지 리턴 및 어쩌면 대문자로 된 키워드의 자유로운 사용을 강력히 권장합니다. 형식이 더 좋은 경우 {} 버튼을 사용하여 질문에있는 코드를 더 예쁘게 만드십시오. 이는 백틱 (예 : 색상 코딩)과 다르게 작동합니다. –

+0

아, 고맙습니다. @ marc_s! –

+0

@marc_s! 서식을 주셔서 감사합니다. @ aaron-bertrand - 중괄호 사용을 잊어 버렸습니다. 팁 주셔서 감사. MS SQL Server Management Studio에서 쿼리를 읽었습니다. – HPWD

답변

1

업데이트 문. 값이 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 

는 여기서 systemname에 일치하는 항목이 있지만 @project NULL이거나 [상태] 두 값에 있지 않을 때 수행 할 작업을 취소하지 않습니다.

+0

병합에 대해 읽었지만 mssql2005에 병합이 존재하지 않는다고 생각합니까? 대괄호 안에 왜 [플랫폼]이 있습니까? – HPWD

+0

예, 당신이 그것을 사용할 수 없다는 것을 알고 있기 때문에 MERGE를 사용하여 솔루션을 작성하지 않았습니다. (하지만 당신은 언젠가는 2008 년이 될 것입니다.) 플랫폼 및 상태는 예약어이기 때문에 대괄호 안에 표시됩니다. SSMS에서 T-SQL을 코딩하면 다른 색상으로 강조 표시됩니다. 예약어를 피하는 것이 가장 좋습니다. 다음 단계는 제대로 탈출하는 것입니다. –

+0

우수. 설명 해줘서 고마워. 플랫폼이 예약어라는 것을 알지 못했습니다. – HPWD