2008-09-12 27 views
4

私はしばらくポッドキャストのブログを聞いています、私はこれを中断しないことを願っています。 質問はこれです: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、です。

次の例は、正しい使い方を示しています。より完全な例のチェックアウトについては、Using OPENXMLのMSDNドキュメントを参照してください。

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にxsl:value-of以外の部分をラップする必要があります。そして、XSLTの出力がテキストであることを確認する必要があります。つまり、DBを介して実行できるSQL文のリストを取得できます。ストアドプロシージャとしてロードできるT-SQLステートメントを出力するためにXSLTを使用することもできます。

関連する問題