В SQL Server 2008 искам да идентифицирам елементи, които не съдържат даден дъщерен елемент в случай, че името на дъщерния елемент е динамично. В този XML и трите li елемента съдържат F1 и F2 дъщерни елементи, а 2-ри и 3-ти li правят не съдържат елемент ръбове. Мога да намеря liбез edges деца, ако името на елемента edges е известно предварително - вижте exist< /em> заявка по-долу, която връща 1, както трябва.
declare @x xml = '<data>
<li>
<F1>ellipse</F1>
<F2 />
<edges/>
</li>
<li>
<F1>triangle</F1>
<F2>3</F2>
</li>
<li>
<F1>square</F1>
<F2>4</F2>
</li>
</data>';
select @x.exist('/data/li[not(F1)]') -- returns 0, there is no li without an F1 (OK)
select @x.exist('/data/li[not(edges)]') -- returns 1, there is an li without edges (OK)
Но ако стойността на ръбове не е известна предварително, как да я посоча с помощта на SQL променлива? Бих искал да кодирам нещо като следното:
declare @ChildElement varchar(100) = 'edges';
select @x.exist('/data/li[not(sql:variable("@ChildElement"))]') -- not allowed
но sql:променлива не е валидна в този контекст в SQL Server. Опитах също комбинации с помощта на local-name():
select @x.exist('/data/li[not(local-name()=sql:variable("ChildElement"))]') -- always returns 1
но винаги връща 1. Мисля, че защото винаги има li с дъщерен елемент, който не е F1, и винаги има li с дъщерен елемент, който не е ръбове. Как мога да идентифицирам само li без поделемента edges, ако edges е в SQL променлива? Между другото, използвам SQL Server 2008, въпреки че мисля, че това важи за всички версии на SQL Server от 2005 г. нагоре.