如何使用SQL DML动态更改索引值

如何使用SQL DML动态更改索引值,sql,sql-server,xml,dml,Sql,Sql Server,Xml,Dml,我是XML和SQL的初学者。如何在insert语句中指定索引,如下所示。下面的语句给出了具有无效更新路径的抛出异常 set @xmldata.modify('insert <Test>Test1</Test> after (/xyz/abc)[sql:variable("@index")]') set@xmldata.modify((/xyz/abc)[sql:variable(@index”)]之后插入Test1) 有一些示例,但这并不是说要更改索引,而是说明语句的

我是XML和SQL的初学者。如何在insert语句中指定索引,如下所示。下面的语句给出了具有无效更新路径的抛出异常

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

有一些示例,但这并不是说要更改索引,而是说明语句的其他部分。

您是否查看了本文

选择@myDoc
set@myDoc.modify('
插入坚固耐用的
之后(/Root/ProductDescription/Features/Material)[1]
')       
选择@myDoc;
这假定存在物料标记。路径(/xyz/abc)有效吗


1年零件和劳动力
可提供3年零件和人工延长维护
铝
坚固耐用
另外,使用文本而不是sql:变量测试当前代码

同样,请发布xml/代码

谢谢

中的John

表达式2必须返回单个节点。当查询第一次被解析时,检查就完成了,SQL Server无法计算您正在使用的谓词,以确定表达式是否总是返回单个节点。但是,如果在括号中指定一个文本值,SQL Server知道将只返回一行

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

set@xmldata.modify('insert Test1
在(/xyz/abc[sql:variable(@index”)][1]'之后
这将为您提供所需的节点

/xyz/abc[sql:variable(“@index”)]
这将告诉SQLServer表达式保证返回一个节点

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

请发布实际代码、表格和一些示例数据。那会有帮助的…嘿,约翰,非常感谢你的回复。我确实检查了没有sql:variable的代码,该代码运行良好。让我们考虑一下你所举的例子。代码>(/Root/ProductDescription/Features/Material)[1]如何从中替换
[1]
SELECT @myDoc       
set @myDoc.modify('       
insert <BikeFrame>Strong long lasting</BikeFrame> 
after (/Root/ProductDescription/Features/Material)[1]       
')       
SELECT @myDoc;
<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>