Проблема SQL-запроса SQL Server 2005 с методом .exist - PullRequest
0 голосов
/ 01 июля 2010

У меня есть этот XML-запрос в SQL Server 2005:

SElECT XmlField FROM tablename WHERE xmlField.exist('(/Root/Name[id="10")[1]') = 1

Однако я хочу заменить значение «10» параметромперейти к хранимой процедуре.Как мне этого добиться?Я пытался использовать "@variablename", но он не работает.

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 01 июля 2010

Через несколько минут выдергивания волос ... я нашел ответ ...

Result_XML.exist('(/Root/Name[id="{sql:variable("@myId")}"])[1]') = 1

должно быть записано как

Result_XML.exist('(/Root/Name[id=(sql:variable("@myId"))])[1]') = 1

Я заменил "{ и }" на ( и ) , чтобы включить sql: variable ключевое слово.

0 голосов
/ 12 февраля 2012

Есть еще одна вещь, о которой я узнал во многих многочисленных испытаниях: если ваша переменная является значением 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

Может быть, это очевидно, но я потратил некоторое время, прежде чем понял причину, по которой записи не будут возвращены.

0 голосов
/ 01 июля 2010

Возможно, вы хотите что-то вроде

SELECT XmlField FROM tablename WHERE xmlField.exist('(/Root/Name[id="{ sql:variable("@variablename") }")[1]') = 1

См. http://msdn.microsoft.com/en-us/library/ms188254(v=SQL.100).aspx, как получить доступ к переменным и столбцам в XQuery в SQL Server.

...