【问题标题】:How to get a XML structure from SQL Server stored procedure如何从 SQL Server 存储过程中获取 XML 结构
【发布时间】:2016-10-31 05:26:34
【问题描述】:

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

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

FOR xml path ('Get_Order'),ROOT ('Get_Orders')

我正在寻找类似的东西

EXEC dbo.spMML_GET_ORDERS_FOR_EXPORT
FOR xml path ('Get_Order'),ROOT ('Get_Orders')

现在我有了结构,我可以将数据传递给数据表,然后将该数据表返回给方法。

另外,如果有另一种创建 XML 存储过程的方法,请告诉我,谢谢编码人员。

【问题讨论】:

  • 如果您的dbo.spMML_GET_ORDER_FOR_EXPORT 只是读取 数据,那么使用表值函数 会容易得多(最好是inline TVF) 在这种情况下,就像SELECT * FROM dbo.YourFunction FOR XML PATH('Get_Order'),ROOT('Get_Orders') 一样简单

标签: sql-server xml vb.net stored-procedures


【解决方案1】:

假设您无法修改存储的 proc(由于其他依赖项或其他原因)以使 proc 中的 SELECT 具有 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')

【讨论】:

  • 此外,您可以通过 Aliases COLUMN AS 'Hillary' 在 XML 中设置关系,并通过添加 '/' 来嵌入进一步的关系,例如 'Hillary/Count',以及在节点(将“@”添加到列名称)。请记住,以属性为中心的列不能出现在非以属性为中心的兄弟之后。
【解决方案2】:

有几种方法,一种是使用WITH XMLNAMESPACES(<STRING> AS <NAMESPACE string>) 添加命名空间。 XMLNAMESPACES 可以将适当的 XML 标记嵌入到您的表中,以便与其他应用程序一起使用(希望这是这里的一个因素),从而使文档更容易一些。

根据您的应用程序使用情况,您可以在查询中使用FOR XML {RAW, PATH, AUTO, or EXPLICIT},以及XQUERY 方法...但根据您的需要,请坚持使用更简单的方法,例如XML PATHXML AUTO

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

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 AUTOXMLSCHEMA 一起使用,其中sql datatypes 保存在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 不是一个选项,但您可以通过XML SCHEMA COLLECTIONS 之类的解决方案或我展示的查询本身来解决这个问题。

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

最后,我想你会发现 Paparazzi 有一个关于这个话题的问题,涵盖的范围很广。 TSQL FOR XML PATH Attribute On , Type

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 2014-03-07
    相关资源
    最近更新 更多