我正在开发一个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存储过程的方法,请告诉我感谢编码员。
答案 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 PATH
或XML 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 AUTO
与XMLSCHEMA
一起使用,其中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