2017-08-31 4 views
0

Die folgende SQL-Server (Version 2008) CodeWie wähle ich ein Attribut, dessen Name einem Variablenwert entspricht?

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 

kehrt

 
(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 

Das erwartete Ergebnis ist

 
(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 

Das Problem in der Leitung ist return <s>{data($k/@Name)} = {data($r[.=$k/@Name])} and </s>}1=1) or, muss ich das wählen Wert von $r/@($k/@Name) (der Syntaxfehler hat) anstelle von $r[.=$k/@Name].

Antwort

2

Berechnung dynamisch Attributnamen ist nicht wirklich idiomatische XQuery, aber es kann durch Auflisten alle Attribute mit @* und dann manuell Filtern des von Ihnen durch den Zugriff auf seinen Namen fn:local-name() mit wollen erfolgen:

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> 
Verwandte Themen