使用同一行中另一个字段提供的属性值进行SQL XML解析

时间:2018-06-13 13:21:03

标签: sql-server xml tsql xml-parsing

上下文:我正在从Web服务表中抓取一些XML表单描述,希望使用该名称来标识用户输入的响应。由于此描述会针对流程的每个步骤(行)以及每个产品进行更改,因此我需要能够动态评估的内容。

我尝试了什么:以下内容非常有用,但它在其自己的字段ans中返回动态属性查询结果,使用合并来减少结果,因为一个字段会导致结果#39;自身的并发症:Get values from XML tags with dynamically specified data fields

当前尝试: 我使用以下代码生成属性名称,我将在下一步中查询属性的值:

case when left([Return], 5) = '<?xml' 
    then lower(cast([Return] as xml).value('(/response/form/*/@name)[1]','varchar(30)')) 
    else '' 
    end as [FormRequest]

作为第2步的一部分,我使用了STUFF函数来尝试使行级查询成为可能

case when len(FormRequest)>0
    then stuff( ',' + 'cast([tmpFormResponse] as xml).value(''(/wrapper/@' + [FormRequest] + ')[1]'',''varchar(max)'')', 1, 1, '') 
    else '' 
    end as [FormResponse] 

而不是看到1作为我的FormReponse feild值返回的提交属性(请参见下面的黄色),它返回查询文本 - cast([tmpFormResponse] as xml).value(&#39; (/ wrapper / @ submit)1&#39;,&#39; varchar(max)&#39;) - 而不是(应该查询的)。 query result

我应该如何操作value方法,以便根据FormRequest字段中的字段值动态去除tmpFormResponse中每行XML数据的响应?

感谢名单

2 个答案:

答案 0 :(得分:1)

你可以看看:

DECLARE @xml XML=
N'<root>
<SomeAttributes a="a" b="b" c="c"/>
<SomeAttributes a="aa" b="bb" c="cc"/>
</root>';

DECLARE @localName NVARCHAR(100)='b';

SELECT sa.value(N'(./@*[local-name()=sql:variable("@localName")])[1]','nvarchar(max)')
FROM @xml.nodes(N'/root/SomeAttributes') AS A(sa) 

答案 1 :(得分:0)

通过使用PATINDEX和CHARINDEX在he tmpFormResponse字段的[FormRequest]字段中查找值来结束解决问题的方法。