将XML传输到SQL Server的最佳方法?
我已经听了一段时间的播客博客,我希望我不会破坏这一点。
问题是这样的:我必须将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语句,我们可以将其作为存储过程加载。