从XML参数到函数

时间:2015-08-05 14:00:20

标签: sql sql-server xml sql-server-2008

我正在处理存储过程,我想从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。

1 个答案:

答案 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数据类型而不是字符串;如果使用字符串更方便,可以更改它。