我是使用SQL的XML初学者。如何在insert语句中指定索引,如下所示。以下语句为抛出异常提供了无效的更新路径。
set @xmldata.modify('insert <Test>Test1</Test> after (/xyz/abc)[sql:variable("@index")]')
sql:variable() Function (XQuery)有一些例子,但这并不是关于改变索引而是谈论声明的其他部分。
答案 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]