2017-08-31 27 views
0

次の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 = and b = and 1=1) or 
    (a = and b = and 1=1) or 
    (a = and b = and 1=1) or 
    (a = and b = and 1=1) or 
    (a = and b = and 1=1) or 
    (a = and b = and 1=1) or 

期待される結果は、問題はラインreturn <s>{data($k/@Name)} = {data($r[.=$k/@Name])} and </s>}1=1) orである

 
(a = 444010 and b = 2 and 1=1) or 
    (a = 444012 and b = 3 and 1=1) or 
    (a = 444003 and b = 2 and 1=1) or 
    (a = 444009 and b = 4 and 1=1) or 
    (a = 444002 and b = 3 and 1=1) or 
    (a = 444005 and b = 1 and 1=1) or 

ですが、私は選択する必要があります値は$r[.=$k/@Name]の代わりに$r/@($k/@Name)(構文エラーがあります)です。

答えて

2

は動的に属性名を計算することは、本当に慣用の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>