2012-02-10 2 views
1

.xls 테이블에서 생성 된 DataTable이 있습니다.다른 원본 (DataTable)의 데이터로 SQL Server 테이블을 업데이트하는 방법

DataTable을 SQL Server 데이터베이스의 기존 테이블에 저장하고 싶습니다.

나는 고유 한 PK을 가진 행을 저장하기 위해 SqlBulkCopy을 사용합니다.

문제는 또한 SQL 서버 테이블과 같은 PK을하지만 SQL 서버 테이블에 비해 다른 값을 가진세포를 포함하는 다른 행이된다. 한마디로

:

이의 내가이 같은 행이 내 DataTable에 있다고 가정 해 봅시다 :

ID (PK) | 이름 | 넘버

005 | abc | 123

006 | lge | 122

제 SQL Server의 경우 이처럼 sth가 있습니다.

id (PK) | 이름 | 번호

004 | cbs | 345

005 | lks | 122

이제 행 을 SqlBulkCopy을 사용하여 SQL Server에 바로 업로드 할 수 있습니다. 반면에 행 은 SQL 서버 테이블에 동일한 PK를 가진 행이 포함되어 있으므로이를 사용하여 삽입 할 수 없습니다.

이제 수동으로 행을 추출하려고했습니다. 각 단일 셀을 ArrayList로 추출한 후 나중에 UPDATE Table 문을 생성하십시오. 그러나이 방법은 처리 할 행이 너무 많기 때문에 실현 불가능한 것으로 보입니다.

이 목표를 달성하기위한 더 나은 방법을 찾고 있습니다.

도움을 주시면 감사하겠습니다.

감사의

+0

누군가 테이블 포맷을 도와 줄 수 있습니까? 너무 혼란스러워 보이지 않기를 바랍니다. – rofans91

+0

성공적인 구현을 원한다고 말하지만 "005"의 id에 정확히 수행 할 작업을 설명하지는 마십시오. 데이터베이스 테이블의 데이터를 덮어 쓰시겠습니까? 아니면 그냥'DataTable'에서 무시합니까? –

+0

덮어 쓰고 싶습니다. – rofans91

답변

2

를 사용하여 아래 코드 :

C#을 측면 코드 XML 데이터의 DataTable에서 데이터를 읽고 준비하는 : 저장 프로 시저

DataTable dt = new DataTable(); 
StringBuilder sb = new StringBuilder(); 

sb.Append("<R>"); 
for (int i = 0; i < dt.Rows.Count; i++) 
{ 
    sb.Append("<C><ID>" + dt.Rows[0].ToString() + "</ID>"); 
    sb.Append("<N>" + dt.Rows[1].ToString() + "</N>"); 
    sb.Append("<I>" + dt.Rows[2].ToString() + "</I></C>"); 
} 

sb.Append("</R>"); 

///pass XML string to DB side 
/// 
//sb.ToString(); //here u get all data from data table as xml format 

데이터베이스 측 (당신은 업데이트해야됩니다 테이블 이름) :

CREATE PROCEDURE dbo.UpdateData 
    -- Add the parameters for the stored procedure here 
    @data  XML 
AS 
BEGIN 
    SET NOCOUNT ON; 

    -- keep data into temp table 
    create table #tmp_data (id nchar(2),name varchar(20), number int) 

    DECLARE @XMLDocPointer INT 
    EXEC sp_xml_preparedocument @XMLDocPointer OUTPUT, @DATA 

    INSERT INTO #tmp_data(id,name,number) 
    SELECT ID,N,I 
    FROM OPENXML(@XMLDocPointer,'/R/C',2) 
    WITH(
      ID nchar(30), 
      N VARCHAR(20), 
      I int 
     ) 

    EXEC sp_xml_removedocument @XMLDocPointer 

    begin tran 
     -------------------INSERT not existing ones 
     INSERT INTO TABLE (id,name,number) 
     SELECT id,name,number 
     FROM #tmp_data 
     WHERE NOT EXISTS 
     (
      SELECT 1 
      FROM TABLE 
      WHERE ID = #tmp_data.ID 
     ) 

     --- update existing ones 
     UPDATE TABLE 
     SET name = #tmp_data.name, number = #tmp_data.number 
     FROM #tmp_data 
     WHERE #tmp_data.id = TABLE.id 

     commit tran 

    if(@@error <> 0) 
     rollback tran 

END 
+0

대단한 답변입니다. 잘 했어! – rofans91

관련 문제