Chr*_*ian 10 xml sql t-sql xquery sql-server-2008
我想使用存储过程将作为参数传入的一些值插入到列的xml中的元素中.到目前为止我有这个以下参数:
@profile_id int,
@user_id nvarchar(50),
@activity_name nvarchar(50),
@display_name nvarchar(50)
Run Code Online (Sandbox Code Playgroud)
检索所需的xml:
DECLARE @profiles_xml xml
SET @profiles_xml = (SELECT profiles from tbl_applied_profiles WHERE profiles.value('(Profile/ID)[1]','int')= @profile_id)
Run Code Online (Sandbox Code Playgroud)
@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>
Run Code Online (Sandbox Code Playgroud)
尝试使用特定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]')
Run Code Online (Sandbox Code Playgroud)
我也试过这个没有成功:
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]')
Run Code Online (Sandbox Code Playgroud)
还有这个:
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]')
Run Code Online (Sandbox Code Playgroud)
这样做的正确方法是什么?
Mik*_*son 18
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]')
Run Code Online (Sandbox Code Playgroud)
结果:
<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>
Run Code Online (Sandbox Code Playgroud)