Sql server 如何从SQLServer存储过程中获取XML结构

Sql server 如何从SQLServer存储过程中获取XML结构,sql-server,xml,vb.net,stored-procedures,Sql Server,Xml,Vb.net,Stored Procedures,我正在开发一个vb.net应用程序,管理层希望我将应用程序数据源从SQL Server更改为XML 我在旧应用程序中有一个名为WebData.vb的类,我需要找到一种方法来替换其中的存储过程,并使其读取xml。因此,我考虑从存储过程的返回结果集中获取xml结构。我在网上看了看,他们说对于普通的select语句,您可以这样做: FOR xml path ('Get_Order'),ROOT ('Get_Orders') 我在找像这样的东西 EXEC dbo.spMML_GET_ORDERS_FO

我正在开发一个vb.net应用程序,管理层希望我将应用程序数据源从SQL Server更改为XML

我在旧应用程序中有一个名为WebData.vb的类,我需要找到一种方法来替换其中的存储过程,并使其读取xml。因此,我考虑从存储过程的返回结果集中获取xml结构。我在网上看了看,他们说对于普通的select语句,您可以这样做:

FOR xml path ('Get_Order'),ROOT ('Get_Orders')
我在找像这样的东西

EXEC dbo.spMML_GET_ORDERS_FOR_EXPORT
FOR xml path ('Get_Order'),ROOT ('Get_Orders')
现在我有了这个结构,我可以将数据传递给一个datatable,然后将这个datatable返回给方法


另外,如果有其他方法创建XML存储过程,请让我知道,谢谢编码人员。

假设您无法修改存储过程(由于其他依赖关系或其他原因),使
选择
在过程中使用
FOR XML
语法,您可以使用
INSERT
/
EXEC
将存储过程的结果插入临时表或表变量,然后将
FOR XML
应用于这些结果的查询

像这样的方法应该会奏效:

DECLARE @Data TABLE (...) -- Define table to match results of stored proc
INSERT @Data
    EXEC dbo.spMML_GET_ORDERS_FOR_EXPORT
SELECT * FROM @Data FOR xml path ('Get_Order'),ROOT ('Get_Orders')

有几种方法,一种是使用
和XMLNAMESPACES(AS)
添加名称空间
XMLNAMESPACES
可以将适当的
XML
标记嵌入到您的表中,以便与其他应用程序一起使用(希望这是其中的一个因素),从而使文档编制变得更加简单

根据您的应用程序使用情况,您可以在查询中使用
FOR XML{RAW、PATH、AUTO或EXPLICIT}
,也可以使用
XQUERY
方法……但根据您的需要,请使用更简单的方法,如
XML PATH
XML AUTO

XML路径
非常灵活,但是您无法直接识别列数据类型

XMLNAMESPACE

WITH XMLNAMESPACES('dbo.MyTableName' AS SQL)
SELECT DENSE_RANK() OVER (ORDER BY Name ASC) AS 'Management_ID'
     , Name AS [Name]
     , Began AS [Team/@Began]
     , Ended AS [Team/@Ended]
     , Team AS [Team]
     , [Role]
FROM dbo.SSIS_Owners
FOR XML PATH, ELEMENTS, ROOT('SQL')
XML自动

因为您可能希望返回数据库,所以我建议将
XML AUTO
XMLSCHEMA
一起使用,
sql数据类型
保存在
XML

SELECT DENSE_RANK() OVER (ORDER BY Name ASC) AS 'Management_ID'
     , Name AS [Name]
     , Began AS [Team/@Began]
     , Ended AS [Team/@Ended]
     , Team AS [Team]
     , [Role]
FROM dbo.SSIS_Owners
FOR XML AUTO, ELEMENTS, XMLSCHEMA('SSIS_Owners')
缺点是
XMLNAMESPACES
不是一个选项,但您可以通过
xmlschema COLLECTIONS
之类的解决方案或查询本身来解决这个问题,如我所示

您也可以直接使用
XML路径
,而不使用名称空间,但这取决于您将所有内容转换为
XML
文件时的应用程序使用情况。 还要注意我是如何定义嵌入属性的。这里有一个学习点,但请按照
XML
出现的顺序来考虑查询。这就是为什么我首先定义变量属性,然后才说明该节点的文本是什么


最后,我想你会发现狗仔队在这个话题上提出了一个相当广泛的问题

此外,您可以将XML by Alias列中的关系设置为“Hillary”,并通过添加“/”如“Hillary/Count”嵌入进一步的关系,以及在节点中嵌入属性(将“@”添加到列名)。请记住,以属性为中心的列不能位于非以属性为中心的同级之后。如果导出的
dbo.spMML\u GET\u ORDER\u
只是读取数据,那么使用表值函数而不是此函数(最好是内联TVF)会容易得多。在这种情况下,它与从dbo中选择*一样简单('Get_Order'),ROOT('Get_Orders')