2013-11-04 2 views
0

내가 SQL에 아주 새로운 그리고 난 SQL 서버에 쓰기를 시도하고있어 절차와 약간의 도움을 찾고 결과 2005SQL 삽입/업데이트 테이블

나는 삽입하기 위해 노력하고있어 또는 쿼리 결과로 테이블을 업데이트 할 수 있습니다.

INSERT 벌금을 작성했으며 예상대로 작동하지만 레코드가 이미있는 경우 삽입 대신 업데이트하려고합니다.

내 현재 코드는 다음과 같습니다

INSERT INTO testTable 
    (field1 , 
     field2 , 
     field3, 
     field4, 
     field5 , 
    )         
select 
    'A000001' 
    table2.field2, 
    GETDATE() , 
    GETDATE() , 
    NULL , 
    NULL , 
    0 

from 
    table1 
INNER JOIN 
    table2 ON table1.field1 = table2.field1 
INNER JOIN 
    table3 ON table2.field1 = table3.field1 
INNER JOIN 
    table4 ON table3.field1 = table4.field1 
WHERE condition 

내가 선택에서 field2testTable에 이미있는 경우 다음이 대신 삽입의 업데이트합니다 있도록이를 변경하고 싶습니다. 나는 여러 레코드를 반환 할 수 있으므로이 작업을 수행하는 방법을 잘 모릅니다.

는 좀 다른 질문을 살펴 했어하지만 아무도 내가 대답 질문을 발견했습니다 (또는 여러 개의 레코드에 대한 답변을 변경하는 방법을 잘 모르겠어요)

이 어떤 도움 감사를!

감사합니다,

+0

SQL Server 2008에는 MERGE가 도입되었습니다. 불행하게도 2008 이전 버전은 여러 문장을 포함하는 빈약 한 옵션을 남겨 둡니다 (하지만 SQL Server 2005 병합 또는 SQL Server 2005 업서 트를 검색하여 찾을 수 있어야 함) –

+0

upserts를 보았지만 내 성명서를 사용해야 할 것입니다. 다시 이것이 정확한지 확실하지 않았습니다. 여러 레코드가 반환되면 이로 인해 문제가 발생합니까? – user2952149

+0

쿼리의'select '부분이 비싼 경우 임시 테이블/테이블 변수에'select' 결과를 저장할 수 있습니다. –

답변

0

INSERT

INSERT INTO testTable 
    (field1 , 
     field2 , 
     field3, 
     field4, 
     field5 , 
    )         
select 
    'A000001' 
    field2, 
    GETDATE() , 
    GETDATE() , 
    NULL , 
    NULL , 
    0 

from 
    table1 
INNER JOIN 
    table2 ON table1.field1 = table2.field1 
INNER JOIN 
    table3 ON table2.field1 = table3.field1 
INNER JOIN 
    table4 ON table3.field1 = table4.field1 
WHERE condition and not exists(select * from testable where table1.field2=testable.field2) 

UPDATE

UPDATE test 
SET 
    test.field1='A000001' 
    test.field3=GETDATE() , 
    test.field4=NULL , 
    test.field5=0 

from 
    testtable as test inner join table1 on test.field2=table1.field2 
INNER JOIN 
    table2 ON table1.field1 = table2.field1 
INNER JOIN 
    table3 ON table2.field1 = table3.field1 
INNER JOIN 
    table4 ON table3.field1 = table4.field1 
WHERE condition 
+0

죄송합니다. 제 질문을 좀 더 명확히해야합니다. 업데이트 기능을 작성하는 방법을 알고 있습니다. 업데이트 할시기와 삽입시기를 고민하고 있습니다. – user2952149

+0

필자가 작성한 코드는 INSERT 할 때와 업데이트 할 때를 처리합니다. – Madhivanan

0

최고의 작업은 병합을 사용하는 것입니다.

;with blabla as (select 
    'A000001' 
    field2, 
    GETDATE() , 
    GETDATE() , 
    NULL , 
    NULL , 
    0 

from 
    table1 
INNER JOIN 
    table2 ON table1.field1 = table2.field1 
INNER JOIN 
    table3 ON table2.field1 = table3.field1 
INNER JOIN 
    table4 ON table3.field1 = table4.field1 
) 
merge into test as target 
using (select * from blabla) as sources (columnlist...) 
on field2 = field2 
WHEN MATCHED and Source.Field2 <> Target.Field2 THEN 
    UPDATE SET ... 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT (..) VALUES (..) 
WHEN NOT MATCHED BY Source THEN 
DELETE; 
+0

OP 질문 : "SQL Server 2005에서 쓰려고합니다." –

+0

SQL Server 2005를 사용하고 있으므로이 옵션이 아닌 것 같습니다. – user2952149