2012-11-05 29 views
0

是否可以使用邏輯與操作者的XQuery語句存儲過程中刪除元素只有當它的父元素具有特定值,它有一個特定的值?如:使用的邏輯和一個XQuery刪除TSQL

SET @profiles_xml = (SELECT profiles from tbl_applied_profiles WHERE profiles.value('(Profile/ID)[1]','int')= @profile_id) 
    SET @profiles_xml.modify(' 
    delete 
    if(/Profile/User/ID=sql:variable("@user_id")) and (/Profile/User/Activities/Activity/Name = sql:variable("@activity_name")) 
    then (/Profile/User/Activities/Activity) 
    else() 
    ') 

我想刪除的活動,只有當用戶ID元素和活動名稱元素匹配給定的參數。 在profiles_xml的XML看起來是這樣的:

<Profile> 
    <ID>20</ID> 
    <User> 
    <ID>BC4A18CA-AFB5-4268-BDA9-C990DAFE7783</ID> 
    <Name>somename</Name> 
    <Activities> 
     <Activity> 
     <Name>activity1</Name> 
     </Activity> 
    </Activities> 
    </User> 
</Profile> 

但將來有可能會在每多個元素的多個元素作爲元素的孩子。

回答

4
declare @XML xml = ' 
<Profile> 
    <ID>20</ID> 
    <User> 
    <ID>BC4A18CA-AFB5-4268-BDA9-C990DAFE7783</ID> 
    <Name>somename</Name> 
    <Activities> 
     <Activity> 
     <Name>activity1</Name> 
     </Activity> 
    </Activities> 
    </User> 
</Profile>' 

declare @user_id nvarchar(50) = '20' 
declare @activity_name nvarchar(50) = 'activity1' 

set @XML.modify('delete /Profile[ID = sql:variable("@user_id")] 
         /User/Activities/ 
         Activity[Name = sql:variable("@activity_name")]') 

select @XML 
+0

謝謝你的迴應,但我不得不使用 '@user_id爲nvarchar(50)'' 爲nvarchar @activity_name(50)' 所以這將是 'SET @ xml.modify(」 \t刪除/資料/用戶[ID = SQL:可變( 「@ USER_ID」)] /活動/活動/名稱[SQL:可變( 「@ ACTIVITY_NAME」)] \t ')' 正確?但是,當我嘗試,我得到的錯誤: '的XQuery [修改()]:只有單(可選)允許作爲謂詞,發現數字/布爾值或節點*表達式「的xs:字符串?」' – Christian

+0

啊,我發現我有'/活動/活動/名稱[SQL:可變( 「@ ACTIVITY_NAME」)]'當我需要'/活動/活動/名稱= [SQL:可變( 「@ ACTIVITY_NAME」)]'但是現在我收到錯誤: '的XQuery [修改()]:一個表達expected' – Christian

+0

我有更新使用變量名的答案。 –