【问题标题】:How to dynamically change the index value with SQL DML如何使用 SQL DML 动态更改索引值
【发布时间】:2014-02-20 02:32:22
【问题描述】:

我是使用 SQL 的 XML 初学者。如何在插入语句中指定索引,如下所示。以下语句给出了抛出异常,更新路径无效。

set @xmldata.modify('insert <Test>Test1</Test> after (/xyz/abc)[sql:variable("@index")]')

sql:variable() Function (XQuery) 有一些示例,但这并不是说更改索引而是更改语句的其他部分。

【问题讨论】:

  • 请贴出实际代码、表格和一些示例数据。这将有助于...

标签: sql sql-server xml dml


【解决方案1】:

insert (XML DML) 中的Expression2 必须返回单个节点。检查在第一次解析查询时完成,然后 SQL Server 无法评估您用来确定表达式是否总是返回单个节点的谓词。但是如果你在括号中指定一个文字值,SQL Server 就知道只会返回一行。

要解决您的问题,您需要在表达式末尾添加 [1]

set @xmldata.modify('insert <Test>Test1</Test> 
                     after (/xyz/abc[sql:variable("@index")])[1]')

这将为您提供所需的节点

/xyz/abc[sql:variable("@index")]

这将告诉 SQL Server 表达式保证返回一个节点。

(/xyz/abc[sql:variable("@index")])[1]

SQL Fiddle

【讨论】:

    【解决方案2】:

    你看过这篇文章了吗? http://technet.microsoft.com/en-us/library/ms175466.aspx

    SELECT @myDoc       
    set @myDoc.modify('       
    insert <BikeFrame>Strong long lasting</BikeFrame> 
    after (/Root/ProductDescription/Features/Material)[1]       
    ')       
    SELECT @myDoc;
    

    这假设 Material 标签存在。路径(/xyz/abc)是否有效?

    <Root>
      <ProductDescription ProductID="1" ProductName="Road Bike">
        <Features>
          <Warranty>1 year parts and labor</Warranty>
          <Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
          <Material>Aluminium</Material>
          <BikeFrame>Strong long lasting</BikeFrame>
        </Features>
      </ProductDescription>
    </Root>
    

    另外,使用文字而不是 sql:variable 测试您当前的代码。

    再次,请发布 xml/代码。

    谢谢

    约翰

    【讨论】:

    • 嗨,约翰,非常感谢您的回复。我确实检查了没有 sql:variable 的代码,它工作正常。让我们考虑一下您提出的示例。 (/Root/ProductDescription/Features/Material)[1] 如何替换 [1]
    猜你喜欢
    • 1970-01-01
    • 2017-06-25
    • 2022-01-10
    • 2019-06-14
    • 1970-01-01
    • 2017-11-15
    • 2011-03-26
    • 2021-12-12
    • 2022-08-09
    相关资源
    最近更新 更多