使用“.exist”方法的SQL Server 2005 XML查询问题

时间:2010-07-01 10:33:37

标签: sql-server-2005 xquery

我在SQL Server 2005中有这个XML查询:

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

但是,我想用我传递给存储过程的参数替换值“10”。我该如何实现这一目标?我尝试使用“@variablename”但它不起作用。

提前致谢。

3 个答案:

答案 0 :(得分:0)

可能你想要像

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

有关如何在SQL Server中的XQuery中访问变量和列,请参阅http://msdn.microsoft.com/en-us/library/ms188254(v=SQL.100).aspx

答案 1 :(得分:0)

拔毛几分钟后......我找到了答案......

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

应该写成

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

我将“{}”替换为以包含 sql :变量关键字。

答案 2 :(得分:0)

我通过许多试验还发现了另外一件事:如果你的变量是一个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

也许这很明显,但我花了一些时间才弄清楚没有记录会被退回的原因。