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

时间:2020-03-05 18:52:28  来源:igfitidea点击:

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

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

解决方案

回答

如果XML符合特定的XSD架构,则可以使用" xsd.exe"命令行工具来研究生成可以绑定XML的Cobject类,然后使用这些对象的属性来形成插入语句:MSDN XSD文件

回答

仔细阅读本文档,它将为我们提供以下选择:

MSDN:Microsoft SQL Server 2005中的XML选项

回答

为了尝试提供帮助,我们可能需要澄清一下。也许通过重述问题,我们可以让我们知道这是否是我们要的问题:

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

我们已经提到的一个相当简单的解决方案是将sp_xml_preparedocument与openxml结合使用。

希望下面的示例说明正确的用法。有关更完整的示例,请参见"使用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导入到文件中的直接方法现有表格。

回答

我们可能想使用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>

match语句很可能不会成为根节点,但希望我们能理解。我们可能还需要在xsl:text中包装非xsl:value-of的部分,以防止多余的字符转储到查询中。而且我们必须确保XSLT的输出是文本。也就是说,我们可以获得可以在数据库中运行的SQL语句的列表。或者可以使用XSLT输出T-SQL语句,我们可以将其作为存储过程加载。