2014-01-28 45 views
2

我是使用SQL的XML初學者。如何在插入語句中指定索引,如下所示。下面的語句給出拋出異常與更新無效路徑。如何使用SQL DML動態更改索引值

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

sql:variable() Function (XQuery)有一些例子,但是,這並不談論更改索引,但語句的其他部分。

+1

請張貼實際的代碼,表和一些示例數據。這將有助於... –

回答

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:variable測試當前代碼。

請再次發佈xml/code。

感謝

約翰

+0

嘿約翰,非常感謝您的回覆。我沒有檢查代碼沒有sql:變量工作正常。我們來考慮一下你的例子。 '(/ Root/ProductDescription/Features/Material)[1]'我該如何替換'[1]'? – sarat

1

表達式2中insert (XML DML)必須返回單個節點。該檢查是在第一次分析查詢時完成的,然後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