我正在处理存储过程,我想从XML参数中获取一个节点并将其传递给函数。这是参数的格式:
@parameters AS XML =
' <parameters>
<vkorgs>
<vkorg>1010</vkorg>
<vkorg>2400</vkorg>
</vkorgs>
<dates>
<datefrom>20150701</datefrom>
<dateto>20150805</dateto>
</dates>
</parameters>
'
这是函数调用(使用示例xml):
sap.werks('<method>Distribution</method>
<vkorgs>
<vkorg>2800</vkorg>
</vkorgs>
<showVkorg>0</showVkorg>')
我现在需要做的是提取“vkorgs”节点并用“method”和“showVkorg”节点丰富它,并将结果传递给“sap.werks”函数。我用'FOR XML'尝试了几种方法,但都没有给我预期的结果。任何帮助表示赞赏。提前谢谢。
编辑:
从@parameters变量中的XML,我需要“vkorgs”节点(仅此节点)将其传递给另一个函数。到目前为止我尝试的是:
declare @parameters AS XML =
' <parameters>
<vkorgs>
<vkorg>1010</vkorg>
<vkorg>2400</vkorg>
</vkorgs>
<dates>
<datefrom>20150701</datefrom>
<dateto>20150805</dateto>
</dates>
</parameters>
'
SELECT 1 as TAG, null as PARENT, c.value('.', 'int') AS [vkorgs!1!vkorg!ELEMENT]
FROM @parameters.nodes('/parameters/vkorgs/vkorg') AS t(c)
FOR XML EXPLICIT;
这将输出以下内容:
<vkorgs>
<vkorg>1010</vkorg>
</vkorgs>
<vkorgs>
<vkorg>2400</vkorg>
</vkorgs>
这是我所期望的,这将是以下内容:
<vkorgs>
<vkorg>1010</vkorg>
<vkorg>2400</vkorg>
</vkorgs>
我有了这个后,我需要添加另外两个节点
<method>Distribution</method>
和
<showVkorg>0</showVkorg>
结果应如下所示:
<vkorgs>
<vkorg>1010</vkorg>
<vkorg>2400</vkorg>
</vkorgs>
<method>Distribution</method>
<showVkorg>0</showVkorg>
最后一步是将所有内容传递给名为“sap.werks”的函数,如下所示:
sap.werks('<vkorgs>
<vkorg>1010</vkorg>
<vkorg>2400</vkorg>
</vkorgs>
<method>Distribution</method>
<showVkorg>0</showVkorg>')
或者,如果可以将结果存储在变量中,我也可以这样称呼它:
sap.werks(@XML)
@XML将保留生成的XML。
答案 0 :(得分:0)
可能最简单的方法如下。这将为您提供XML变量中所需的数据,然后您可以使用它完成所需的操作(将其传递给您的函数等):
DECLARE @fn_param xml
SELECT @fn_param =
(
SELECT @parameters.query('./parameters/vkorgs'),
'Distribution' AS method, 0 AS ShowVkorg
FOR XML PATH (''), TYPE
)
为了分解这是做什么,SELECT
子句中的第一列提取vkorgs
节点,后两列定义新元素(元素的数据是列数据,元素name是列名称)。 FOR XML PATH
是让SQL Server生成XML的简洁方法。默认情况下,它会用包装器节点包围整个事物,但是通过为该节点指定空字符串可以绕过该行为。
TYPE
修饰符导致语句返回xml
数据类型而不是字符串;如果使用字符串更方便,可以更改它。