如何选择一个名称等于变量值的属性



以下SQL Server(2008版(代码

declare @x xml = '
<PKs>
<Column Name="a" />
<Column Name="b" />
</PKs>
<Selected>
<row a="444010" b="2" />
<row a="444012" b="3" />
<row a="444003" b="2" />
<row a="444009" b="4" />
<row a="444002" b="3" />
<row a="444005" b="1" />
</Selected>'
declare @s nvarchar(max) = @x.query('
for $r in /Selected/row 
return <s>({
for $k in /PKs/Column 
return <s>{data($k/@Name)} = {data($r[.=$k/@Name])} and </s>}1=1) or
</s>').value('.', 'nvarchar(max)')
print @s

返回

(a=和b=以及1=1(或(a=和b=和1=1(或(a=和b=和1=1(或(a=和b=和1=1(或(a=和b=和1=1(或(a=和b=和1=1(或

预期结果为

(a=444010,b=2,1=1(或(a=444012,b=3,1=1(或(a=444003,b=2,1=1(或(a=444009,b=4,1=1(或(a=444002,b=3,1=1(或(a=444005和b=1和1=1(或

问题出在return <s>{data($k/@Name)} = {data($r[.=$k/@Name])} and </s>}1=1) or行,我需要选择$r/@($k/@Name)(有语法错误(的值,而不是$r[.=$k/@Name]

动态计算属性名称并不是真正惯用的XQuery,但可以通过使用@*枚举所有属性,然后使用fn:local-name():访问其名称来手动筛选所需的属性

for $r in /Selected/row 
return <s>({
for $k in /PKs/Column
let $col := $r/@*[local-name()=$k/@Name]
return <s>{data($k/@Name)} = {data($col)} and </s>}1=1) or
</s>

最新更新