Sql server 如何从SQLServer存储过程中获取XML结构
我正在开发一个vb.net应用程序,管理层希望我将应用程序数据源从SQL Server更改为XML 我在旧应用程序中有一个名为WebData.vb的类,我需要找到一种方法来替换其中的存储过程,并使其读取xml。因此,我考虑从存储过程的返回结果集中获取xml结构。我在网上看了看,他们说对于普通的select语句,您可以这样做: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
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')