【问题标题】:SQL Server 2005 XML Query problem with ".exist" method“.exist”方法的 SQL Server 2005 XML 查询问题
【发布时间】: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 xquery


    【解决方案1】:

    可能,你想要类似的东西

    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 ']'.
    【解决方案2】:

    在拉了几分钟头发后……我找到了答案……

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

    应该写成

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

    我将 "{}" 替换为 () 以包含 sql :variable 关键字。

    【讨论】:

    • 也许您甚至可以不使用 ( 和 )。也许我从 MSDN 文档中提取的“{ 和 }”中的封闭仅用于构建 XML,而不是用于 XPath 比较。
    • 你说得对,弗兰克, ( 和 ) 不是必需的,没有它们它仍然可以工作。再次感谢您的回复。非常感谢!
    【解决方案3】:

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

    也许这很明显,但我花了一些时间才弄清楚为什么不会返回任何记录。

    【讨论】:

      猜你喜欢
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多