【发布时间】:2011-03-10 13:48:49
【问题描述】:
我在 SQL Server 2005 中有这个 XML 查询:
SElECT XmlField FROM tablename WHERE xmlField.exist('(/Root/Name[id="10")[1]') = 1
但是,我想用传递给存储过程的参数替换值“10”。我如何实现这一目标?我曾尝试使用“@variablename”,但它不起作用。
提前致谢。
【问题讨论】:
我在 SQL Server 2005 中有这个 XML 查询:
SElECT XmlField FROM tablename WHERE xmlField.exist('(/Root/Name[id="10")[1]') = 1
但是,我想用传递给存储过程的参数替换值“10”。我如何实现这一目标?我曾尝试使用“@variablename”,但它不起作用。
提前致谢。
【问题讨论】:
可能,你想要类似的东西
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,了解如何在 SQL Server 中访问 XQuery 中的变量和列。
【讨论】:
...WHERE Result_XML.exist('(/Root/Name[id="{sql:variable("@myId")}"])[1]') = 1 我已经在这行代码之前声明并为变量@myId 分配了一个值我收到了这个错误消息:Msg 9303, Level 16, State 1, Line 15 XQuery [Staff_Process_Triggers.Result_XML.exist()]: Syntax error near '@', expected ']'.
在拉了几分钟头发后……我找到了答案……
Result_XML.exist('(/Root/Name[id="{sql:variable("@myId")}"])[1]') = 1
应该写成
Result_XML.exist('(/Root/Name[id=(sql:variable("@myId"))])[1]') = 1
我将 "{ 和 }" 替换为 ( 和 ) 以包含 sql :variable 关键字。
【讨论】:
我通过很多次试验发现了另外一件事:如果你的变量是一个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
也许这很明显,但我花了一些时间才弄清楚为什么不会返回任何记录。
【讨论】: