上下文:我正在从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;) - 而不是(应该查询的)。
我应该如何操作value方法,以便根据FormRequest字段中的字段值动态去除tmpFormResponse中每行XML数据的响应?
感谢名单
答案 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]字段中查找值来结束解决问题的方法。