我正在尝试查询非类型化XML数据的XML字段以进入存储过程。
该字段具有多个同名元素,并且每个元素具有多个属性。查询需要返回c的值,其中r(字段中的唯一值)的值是已知的。 例如。返回下面 XML 字段中属性c的值,其中属性r的值为"FGH"。r 的每个值都是唯一的,因此只返回一行。
<Assets>
<Cars>
<Car r="ABC" c="Nissan" t="petrol"/>
<Car r="FGH" c="VW" t="petrol"/>
<Car r="XYZ" c="Mini" t="diesel"/>
</Cars>
</Assets>
我尝试过的查询的编辑版本是:
USE MyDB
DECLARE
@ASSETS XML = null,
@car nvarchar(50)
SELECT @ASSETS = ASSETS FROM MyTable WHERE ID = 26800
SELECT @car = @ASSETS.value('(//*/*/@FGH', 'nvarchar(max)') ;
我可以看到这是不对的,但完全卡住了。
因此,您希望在具有值为FGH
的r
属性的元素(任何名称)上显示c
属性的值。您想要的路径是:
//*[@r='FGH']/@c
根据获取值的方式,可能需要显式获取单例值。例:
DECLARE @xml xml = '<Assets>
<Cars>
<Car r="ABC" c="Nissan" t="petrol"/>
<Car r="FGH" c="VW" t="petrol"/>
<Car r="XYZ" c="Mini" t="diesel"/>
</Cars>
</Assets>
';
SELECT @xml.value('(//*[@r="FGH"]/@c)[1]', 'nvarchar(max)');
结果:
----------------------
VW
(1 row(s) affected)
( )[1]
是让 SQL Server 相信您获得的是单个值。