如何从SQL Server存储过程

时间:2016-06-28 18:32:39

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

我正在开发一个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存储过程的方法,请告诉我感谢编码员。

2 个答案:

答案 0 :(得分:0)

假设您无法修改存储过程(由于其他依赖性或其他原因)以使proc中的SELECT具有FOR XML语法,您可以使用{{1 } / INSERT将存储过程的结果插入到临时表或表变量中,然后将EXEC应用于对这些结果的查询。

这样的事情应该有效:

FOR XML

答案 1 :(得分:0)

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

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

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

<强> XML命名空间

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 AUTO

由于您可能想要返回数据库,因此我建议将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