2016-07-11 4 views
0

는 나는 내가 외부 시스템에서 데이터를 다운로드 보유하고 SQL Server의 테이블이TSQL 절차 적 문제와 조언

한 다음 수행 할 수있는 가장 좋은 방법에 대한 조언을 찾고 있어요. 나는 그것을 다른 데이터베이스를 업데이 트하는 데 사용해야합니다. 일부 레코드는 삽입이되고 다른 레코드는 업데이트가됩니다. 삽입/업데이트 할 주석 테이블과 주 테이블이 있습니다. 주석은 주석 테이블에서 생성되고 주 테이블 레코드의 열에 저장된 ID로 연결됩니다. (일대일 관계)

그래서 주석 테이블에 삽입하고 scope_identity 반환 값을 얻은 다음 주 테이블에 대한 삽입 문의 부분으로 사용하십시오.

업데이트는 기본 테이블에있는 레코드에서 주석 ID를 얻을 후 주석 테이블을 업데이트 필요한 경우도 필요

EG 표 5 개 기록

Get first record 
If exists in database 
get commentID column from comment table and update comment and main table 
If not exists 
insert into comment table and return comment ID and insert the record into the main table with that comment ID 
get the next record 

이있는 기본 테이블 SQL Server에서이 작업을 가장 효과적으로 수행하는 방법을 파악하는 데 어려움을 겪고 있습니다. 커서, while 루프, 저장 프로 시저 등의 올바른 조합을 찾을 수 없습니다. SQL Server의 절차 작업을 통해 많은 것을 수행하지 않았습니다.

은 어떤 조언/도움이 크게

감사

Habo

을 감사합니다. 의견에 감사드립니다. 나는 명확한 간결한 질문을 쓰려고 투쟁한다. 링크 된 페이지는 좋은 조언을 제공합니다. 희망이 스크립트는 아래 명확히하는 데 도움이됩니다.

다시 한번 감사드립니다.

USE TEMPDB 

--TABLE TO HOLD JOB RECORDS 
create table tbl_jobs(
jobnumber varchar(16) primary key clustered, 
jobdesc varchar(50), 
commentID int 
) 
GO 

INSERT INTO tbl_jobs VALUES ('Job1','Desc1', '1') 
INSERT INTO tbl_jobs VALUES ('Job2','Desc2', '2') 
INSERT INTO tbl_jobs VALUES ('Job3','Desc3', '3') 

--TABLE TO HOLD JOB RECORD COMMENTS 
create table tbl_jobComments(
commentID INT IDENTITY(1,1) NOT NULL, 
comment text 
) 
GO 
Insert into tbl_jobComments VALUES ('Comment1') 
Insert into tbl_jobComments VALUES ('Comment2') 
Insert into tbl_jobComments VALUES ('Comment3') 


--TABLE TO HOLD RECORDS DOWNLOADED FROM EXTERNAL SYSTEM 
create table tbl_updates(
jobnumber varchar(16) primary key clustered, 
jobdesc varchar(50), 
comment text 
) 
GO 

INSERT INTO tbl_updates VALUES ('Job1','Desc1Modified', 'Comment1') 
INSERT INTO tbl_updates VALUES ('Job2','Desc2', 'Comment2') 
INSERT INTO tbl_updates VALUES ('Job3','Desc3Modified', 'Comment3') 
INSERT INTO tbl_updates VALUES ('Job4','Desc4', 'Comment4') 
GO 

--OUTPUT FROM tbl_Jobs 
+-----------+---------+-----------+ 
| jobnumber | jobdesc | commentID | 
+-----------+---------+-----------+ 
| Job1  | Desc1 |   1 | 
| Job2  | Desc2 |   2 | 
| Job3  | Desc3 |   3 | 
+-----------+---------+-----------+ 

--OUTPUT FROM tbl_JobComments 
+-----------+----------+ 
| commentID | comment | 
+-----------+----------+ 
|   1 | Comment1 | 
|   2 | Comment2 | 
|   3 | Comment3 | 
+-----------+----------+ 

--OUTPUT FROM tbl_updates 
+-----------+---------------+-----------+ 
| jobnumber | jobdesc | comment | 
+-----------+---------------+-----------+ 
| Job1  | Desc1Modified | Comment1 | 
| Job2  | Desc2   | Comment2a | 
| Job3  | Desc3Modified | Comment3 | 
| Job4  | Desc4   | Comment4 | 
+-----------+---------------+-----------+ 


--DESIRED RESULTS tbl_jobs 
+-----------+-----------------+-----------+ 
| jobnumber | jobdesc   | commentID | 
+-----------+-----------------+-----------+ 
| Job1  | Desc1Modified |   1 | 
| Job2  | Desc2   |   2 | 
| Job3  | Desc3Modified |   3 | 
| Job4  | Desc4   |   4 | 
+-----------+---------+-------------------+ 

--DESIRED RESULTS tbl_jobs_comments 
+-----------+-----------+ 
| commentID | comment | 
+-----------+-----------+ 
|   1 | Comment1 | 
|   2 | Comment2a | 
|   3 | Comment3 | 
|   4 | Comment4 | 
+-----------+-----------+ 
+0

, 다음 일에는 INSERT INTO를 할 이유는 기본 테이블에 대한 업데이트 및 개체가 일치 할 때 조인의 사용을 통해 코멘트를하지 e 휴식 (그렇지 않은 경우)? –

+0

너는 멍청 할 필요는 없다. ['OUTPUT'] (https://msdn.microsoft.com/en-us/library/ms177564.aspx) 절을 사용하여 행에서 데이터를 가져올 수 있습니다 (복수 인용). 새로 삽입 된 행에 대한 ID 열 값. 'OUTPUT'은'INSERT','UPDATE','DELETE'와'MERGE'와 함께 사용할 수 있으며'UPDATE'의 경우 _before_와 _after_ 값 모두에 접근 할 수 있습니다. 주머니에 넣을만한 가치가있는 도구. – HABO

+0

답변을 주셔서 감사합니다. 하보, 답장이 가까워졌습니다. 나는 updatetable에서 maintable에 병합을 할 수 있고 새로운 기록과 업데이 트를 얻을. 나는 commentt에 삽입 할 수있는 방법을 알아낼 수 없다. commentID를 출력하고 병합 명령문의 INSERT 부분에서 사용한다. 이것도 가능합니까 아니면 여러 문장에서이 작업을 수행해야합니까? – Gork

답변

0

당신은 2 문, 갱신 및 삽입 쿼리

UPDATE maintable 
SET Comment=upd.comment 
FROM maintable mt 
JOIN updatestable upd 
ON mt.id=upd.id 

다음 어떤 누락 된 삽입 (이 ID 당 한 개의 댓글이 가정)로이 손상 될 수 있습니다 :

INSERT INTO maintable (id,comment) 
SELECT id, comment 
FROM updatestable 
WHERE id NOT IN (SELECT id FROM maintable) 
+0

Seanc, 내 업데이트 표는 댓글 ID가없는, 단지 주석이 있습니다. 요구 사항은 가 commenttable에 새로운 삽입하고 commentID 업데이트 commenttable 및 maintable 기존 포함한 maintable에 삽입 새 commentID (SCOPE_IDENTITY)을 반환이다 – Gork