2013-02-28 3 views
2

SQL Server의 저장 프로 시저에 XML 문자열을 전달하여 내 테이블에 10000 개의 레코드를 삽입합니다. 이 때 나는이 저장 프로 시저를 호출합니다. 삽입하고 싶지 않은 레코드가있는 경우 SQL Server 테이블에서 필자가 지나가는 xml 문자열을 확인하고 레코드가 삽입되어 있어야하는 새 레코드인지 확인하십시오. 일부 솔루션을 제공하십시오. 감사.SQL Server 저장 프로 시저에 xml 문자열 매개 변수 전달

ALTER procedure [dbo].[SP_CMSUSER1] 
     (@xmlString ntext) 
    as 
    begin 

     DECLARE @idoc INT 
     DECLARE @data nvarchar(100) 

     EXEC sp_xml_preparedocument @idoc OUTPUT, @xmlString 

    INSERT INTO dbo.Seg_RecipientsTemp (ContactID,first_name,last_name,company,email,last_updated) 
    SELECT ContactID, 
    first_name, 
    last_name, 
    company, 
    email, 
    last_updated FROM OPENXML(@idoc, 

    '/NewDataSet/ContactData', 6) 

    WITH 

    (ContactID int , 
    first_name nvarchar(50), 
    last_name nvarchar(50), 
    company nvarchar(max), 
    email nvarchar(100), 
    last_updated datetime 



    ) 
    end 

내 XML은 다음과 같습니다

<NewDataSet> 
    <Table> 
    <ContactID>2</ContactID> 
    <last_name>klklk</last_name> 
    </Table> 
    <Table> 
    <ContactID>4</ContactID> 
    <first_name>k</first_name> 
    <last_name>kk</last_name> 
    <company>k</company> 
    </Table> 
    <Table> 
    <ContactID>6</ContactID> 
    <first_name>naveen</first_name> 
    <last_name /> 
    <company>inno</company> 
    </Table> 
    <Table> 
    <ContactID>7</ContactID> 
    <first_name>sridar</first_name> 
    <last_name /> 
    <company>mahindara</company> 
    </Table> 
    <Table> 
    <ContactID>1</ContactID> 
    <first_name>terst</first_name> 
    </Table> 
    <Table> 
    <ContactID>2</ContactID> 
    <first_name /> 
    <last_name>ask</last_name> 
    <company /> 
    </Table> 
</NewDataSet> 
+3

** ** 샘플 XML을보고 당신이 그것에서 추출 할 무엇에 대한 설명을 얻을 도움이 될 것입니다! –

+0

contactid가 xml 문자열이있는 SQL 테이블에 존재하는지 확인하고 싶습니다. 이미 삽입되어 있으면 삽입 할 필요가 없습니다. 새 레코드 만 삽입하면됩니다. 필요하지 않은 경우 (select * from dbo.Seg_RecipientsTemp where Contact_Id = (이 경우 –

+0

'dbo.Seg_RecipientsTemp'에는 존재하지 않지만 XML 데이터에 존재하는'ContactID'에 대한 레코드를 INSERT 하시겠습니까?'dbo.Seg_RecipientsTemp의 데이터를 업데이트 하시겠습니까 ''ContactID'에 대한 XML 데이터가 있습니까? –

답변

9

유형 XML의 매개 변수를 사용하는 저장 프로 시저를 정의 (더 이상 ntext를 사용하지 않는 그것은 사용되지 않는 것!). 저장 프로 시저에 접두어 sp_을 사용하지 마십시오. Microsoft에서 내부적으로 사용하기 위해 예약 된 접두사이며 성능 저하가 발생합니다. 다른 것을 사용하십시오!

ALTER procedure [dbo].InsertCmsUser 
     @xmlString XML 
AS 
    ...... 

이 시도 (또는 전혀 접두사를 사용하지 않는) (SQL 서버의 기본는 XQuery 방법을 사용하여 2005 및 최신 대신 오히려 지저분한 OPENXML 인터페이스의 ....)

;WITH CTE AS 
(
    SELECT 
     ContactID = XTbl.value('(ContactID)[1]', 'int'), 
     FirstName = XTbl.value('(first_name)[1]', 'varchar(50)'), 
     LastName = XTbl.value('(last_name)[1]', 'varchar(50)'), 
     Company = XTbl.value('(company)[1]', 'varchar(50)') 
    FROM 
     @input.nodes('/NewDataSet/Table') AS XD(XTbl) 
) 
INSERT INTO 
    dbo.Seg_RecipientsTemp (ContactID, first_name, last_name, company, last_updated) 
    SELECT 
     ContactID, 
     FirstName, 
     LastName, 
     Company, 
     GETDATE() 
    FROM 
     CTE 
    WHERE 
     NOT EXISTS (SELECT * FROM dbo.Seg_RecipientsTemp WHERE ContactID = CTE.ContactID) 

나는 당신의 XML의 모든 email 속성을 찾을 수 없습니다 - 확실하지 당신이 얻고 싶은 곳에서 ....

UPDAT E : 당신은 또한 당신의 실제 XML에 <last_updated> 요소를 갖고있는 것 같다, 그래서 확인, ...

<last_updated>2012-09-12T22:59:10.813+05:30</last_updated> 

이 나에게 DATETIMEOFFSET처럼 보이는 -는 +05:30 시간대 또한이 있기 때문에. 이 경우

, 대신에이 코드를 사용 :

;WITH CTE AS 
(
    SELECT 
     ContactID = XTbl.value('(ContactID)[1]', 'int'), 
     FirstName = XTbl.value('(first_name)[1]', 'varchar(50)'), 
     LastName = XTbl.value('(last_name)[1]', 'varchar(50)'), 
     Company = XTbl.value('(company)[1]', 'varchar(50)'), 
      LastUpdated = XTbl.value('(last_updated)[1]', 'datetimeoffset') 
    FROM 
     @input.nodes('/NewDataSet/Table') AS XD(XTbl) 
) 
INSERT INTO 
    dbo.Seg_RecipientsTemp (ContactID, first_name, last_name, company, last_updated) 
    SELECT 
     ContactID, 
     FirstName, 
     LastName, 
     Company, 
     LastUpdated 
    FROM 
     CTE 
    WHERE 
     NOT EXISTS (SELECT * FROM dbo.Seg_RecipientsTemp WHERE ContactID = CTE.ContactID) 
+0

당신의 응답을위한 고맙습니다. 죄송합니다. 이메일 아이디가 있습니다. 테스트 목적으로 XML에 didnot을 추가했습니다. 다른 문제가 있습니다. datetime을 lastupdated 필드의 문자열에서 변환 할 때 변환이 실패했습니다. xml에서 태그 아래에옵니다. -09-12T22 : 59 : 10.813 + 05 : 30 .. 약간의 해결책을주세요. –

+0

@ Kamalakannan.M : 게시 한 샘플에' 태그를 보는 것이 좋았을 것입니다! 내 업데이트 된 응답보기 –

+0

XML 구문 분석 : 줄 76442, 글자 53, 불법 XML 문자 –

관련 문제