将xml传输到SQL Server的最佳方法?

时间:2008-09-12 19:19:17

标签: sql-server xml

我已经听过播客博客一段时间了,我希望我不要打破这个。 问题是:我必须将xml插入数据库。这将是已定义的表和字段。那么实现这一目标的最佳方法是什么?到目前为止,我倾向于编程。我一直看到varios选项,一个是数据传输对象(DTO),在SQL Server中有sp_xml_preparedocument,用于将XML传输到对象和代码。

我正在使用CSharp和SQL Server 2005.这些字段不是XML字段,它们是通常的SQL数据类型。

4 个答案:

答案 0 :(得分:2)

为了尝试和帮助,我们可能需要一些澄清。也许通过重述问题,您可以告诉我们这是您要问的问题:

如何在不依赖内置xml类型的情况下将现有xml导入SQL 2005数据库?

您已经提到的一个相当直接的解决方案是 sp_xml_preparedocument ,与 openxml 结合使用。

希望以下示例说明正确的用法。有关更完整的示例,请查看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文件并且正在使用C#,那么定义一个类似于上面的内容然后将整个xml文件内容作为字符串传递给存储过程的存储过程应该会给你将xml导入现有表格的相当直接的方法。

答案 1 :(得分:0)

如果您的XML符合特定的XSD架构,您可以查看使用“xsd.exe”命令行工具生成可以将XML绑定到的C#对象类,然后使用以下属性生成插入语句:那些对象:MSDN XSD Doc

答案 2 :(得分:0)

仔细阅读本文档,它将为您提供选项:

MSDN:XML Options in Microsoft SQL Server 2005

答案 3 :(得分:0)

您可能希望使用XSLT将XML传输到SQL语句中......即

<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>

匹配语句很可能不是根节点,但希望你能得到这个想法。您可能还需要在xsl:text中包装非xsl:value-of部分,以防止将额外字符转储到查询中。而且你必须确保XSLT的输出是文本。这就是说你可以得到一个可以通过DB运行的SQL语句列表。或者您可以使用XSLT输出可以作为存储过程加载的T-SQL语句。