Есть еще одна вещь, о которой я узнал во многих многочисленных испытаниях: если ваша переменная является значением char, если вы объявляете это в своем выражении sql, это должен быть varchar, а не char.
Этот sql не дал никаких результатов:
DECLARE @myparam char(50)
SET @myparam = 'someval'
...
WHERE
t.c.exist('/root/child[text() = sql:variable("@myparam ")]') = 1
Но это сделал:
DECLARE @myparam varchar(50)
SET @myparam = 'someval'
...
WHERE
t.c.exist('/root/child[text() = sql:variable("@myparam ")]') = 1
Может быть, это очевидно, но я потратил некоторое время, прежде чем понял причину, по которой записи не будут возвращены.