2008-09-12 5 views
4

나는 잠시 podcast 블로그를 들었다. 나는 이것을 깨뜨리지 않기를 바란다. 질문은 이것입니다 : xml을 데이터베이스에 삽입해야합니다. 이것은 이미 정의 된 테이블과 필드에 대한 것입니다. 그래서 이것을 달성하는 가장 좋은 방법은 무엇입니까? 지금까지 나는 프로그램에 기대고있다. 내가 varios 옵션을보고, 하나는 데이터 전송 개체 (DTO), 거기에 SQL Server 개체 및 통행 코드에 XML을 전송하는 데 사용되는 sp_xml_preparedocument가 있습니다.xml을 SQL Server로 전송하는 가장 좋은 방법은 무엇입니까?

저는 CSharp 및 SQL Server 2005를 사용하고 있습니다. 필드는 XML 필드가 아니며 일반적인 SQL 데이터 유형입니다.

답변

0

XML이 특정 XSD 스키마를 준수하는 경우 "xsd.exe"명령 줄 도구를 사용하여 XML을 바인딩 할 수있는 C# 개체 클래스를 생성 한 다음 속성을 사용하여 삽입 문을 구성 할 수 있습니다 이러한 개체의 : MSDN XSD Doc

2

, 우리는 몇 가지 설명을해야 할 수도 있습니다. 어쩌면 문제를 다시 말하면 다음과 같이 묻습니다.

내장 xml 유형에 의존하지 않고 기존 xml을 SQL 2005 데이터베이스로 가져올 수있는 방법은 무엇입니까? 이미 언급 한

상당히 똑바로 앞으로 솔루션은 OPENXML과 결합 를 sp_xml_preparedocument이다.

다음 예제는 올바른 사용법을 보여줍니다. 더 완벽한 예제 체크 아웃은 MSDN 문서 Using OPENXML에 있습니다.

declare @XmlDocumentHandle int 
declare @XmlDocument nvarchar(1000) 
set @XmlDocument = N'<ROOT> 
<Customer> 
    <FirstName>Will</FirstName> 
    <LastName>Smith</LastName> 
</Customer> 
</ROOT>' 

-- Create temp table to insert data into 
create table #Customer 
( 
    FirstName varchar(20), 
    LastName varchar(20) 
) 
-- Create an internal representation of the XML document. 
exec sp_xml_preparedocument @XmlDocumentHandle output, @XmlDocument 

-- Insert using openxml allows us to read the structure 
insert into #Customer 
select 
    FirstName = XmlFirstName, 
    LastName = XmlLastName 
from openxml (@XmlDocumentHandle, '/ROOT/Customer',2) 
with 
(
    XmlFirstName varchar(20) 'FirstName', 
    XmlLastName varchar(20) 'LastName' 
) 
where (XmlFirstName = 'Will' and XmlLastName = 'Smith') 

-- Cleanup xml document 
exec sp_xml_removedocument @XmlDocumentHandle 

-- Show the data 
select * 
from #Customer 

-- Drop tmp table 
drop table #Customer 

XML 파일을 다음 위의 같은 것을 수행하는 저장 프로 시저를 정의하고 다음 당신에게 제공해야 문자열로 저장 프로 시저 전체 XML 파일의 내용을 전달, C#을 사용하는 경우 기존 테이블에 xml을 가져 오는 상당히 간단한 방법.

0

당신은 즉

<xml type="user"> 
    <data>1</data> 
    <data>2</data> 
<xml> 

는 그 다음 XSLT가 가장 가능성이되지 않습니다

<xsl:template match="xml"> 
    INSERT INTO <xsl:value-of select="@type" /> (data1, data2) VALUES (
     '<xsl:value-of select="data[1]" />', 
     '<xsl:value-of select="data[2]" />'); 
</xsl:template> 

경기 문 같을 것이다 ... SQL 문으로 XML을 전송하는 XSLT를 사용할 수 있습니다 루트 노드지만, 잘하면 당신은 아이디어를 얻을. 추가 문자가 쿼리에 덤프되지 않도록 xsl : text에 non xsl : value-of 부분을 래핑해야 할 수도 있습니다. 그리고 XSLT의 출력이 텍스트인지 확인해야합니다. 즉, DB를 통해 실행할 수있는 SQL 문 목록을 얻을 수 있다고합니다. 또는 XSLT를 사용하여 저장 프로 시저로로드 할 수있는 T-SQL 문을 출력 할 수 있습니다.

관련 문제