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

时间:2014-01-28 16:42:48

标签: sql sql-server xml dml

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

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

sql:variable() Function (XQuery)有一些例子,但这并不是关于改变索引而是谈论声明的其他部分。

2 个答案:

答案 0 :(得分:1)

你看过这篇文章吗? 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:变量测试当前代码。

再次,请发布xml / code。

由于

约翰

答案 1 :(得分: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