我想使用存储过程将一些作为参数传入的值插入到列的xml中的元素中。到目前为止,我具有以下参数:
@profile_id int, @user_id nvarchar(50), @activity_name nvarchar(50), @display_name nvarchar(50)
检索所需的xml:
DECLARE @profiles_xml xml SET @profiles_xml = (SELECT profiles from tbl_applied_profiles WHERE profiles.value('(Profile/ID)[1]','int')= @profile_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>
尝试将具有特定ID的活动名称和显示名称插入用户:
SET @profiles_xml.modify(' insert if(/Profile/User/ID=sql:variable("@user_id")) then Activity[Name=sql:variable("@activity_name")][DisplayName=sql:variable("@display_name")] else() as first into (/Profile/User/Activities)[1]')
我也尝试过此方法,但没有成功:
SET @devices_xml.modify(' insert /Profile/User[ID=sql:variable("@user_id")]/Activity[Name=sql:variable("@activity_name")][DisplayName=sql:variable("@display_name")] into (/Profile/User/Activities)[1]')
还有这个:
SET @devices_xml.modify(' insert /Profile/User[ID=sql:variable("@user_id")]/Activities/Activity[Name=sql:variable("@activity_name")][DisplayName=sql:variable("@display_name")] into (/Profile/User/Activities)[1]')
正确的方法是什么?
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' declare @display_name nvarchar(50) = 'displayname1' set @xml.modify('insert <DisplayName>{sql:variable("@display_name")}</DisplayName> into (/Profile[ID = sql:variable("@user_id")] /User/Activities/ Activity[Name = sql:variable("@activity_name")])[1]')
结果:
<Profile> <ID>20</ID> <User> <ID>BC4A18CA-AFB5-4268-BDA9-C990DAFE7783</ID> <Name>somename</Name> <Activities> <Activity> <Name>activity1</Name> <DisplayName>displayname1</DisplayName> </Activity> </Activities> </User> </Profile>