我将数据序列化为SQL Server表中的XML列,格式为:
tr
元素<Form title="Sample Data">
<MyProperty>1234</MyProperty>
<Employee>
<MyProperty>1234</MyProperty>
</Employee>
</Form>
可以位于根级别,也可以位于MyProperty
下的子元素。
我需要的是一个SQL脚本:
<Employee>
(我不关心它的子版本) MyProperty
的值之前已经计算过,我计划将它放在临时表中,以及包含序列化XML的行的PK。
有人可以就如何做到这一点给出一些指导吗?
答案 0 :(得分:1)
第一个问题可以通过使用简单的XPATH语法来解答,如下所示。
declare @x xml = '<Form title="Sample Data">
<MyProperty>1234</MyProperty>
<Employee>
<MyProperty>1234</MyProperty>
</Employee>
</Form>';
--does MyProperty exist at the root level?
declare @rootlevelvalue nvarchar(max) = (select T.c.value('(MyProperty)[1]','nvarchar(max)') from @x.nodes('/Form') T(c));
if @rootlevelvalue is not null
begin
print 'yes, it exists at the root level (value = ' + @rootlevelvalue + ')';
end
else
begin
print 'no, it does not exist at the root level'
end
第二个问题可以用XPATH的插入语法来解答。
declare @y xml = '<Form title="Sample Data">
<Employee>
<MyProperty>1234</MyProperty>
</Employee>
</Form>';
--does MyProperty exist at the root level?
declare @rootlevelvalue nvarchar(max) = (select T.c.value('(MyProperty)[1]','nvarchar(max)') from @y.nodes('/Form') T(c));
if @rootlevelvalue is not null
begin
print 'yes, it exists at the root level (value = ' + @rootlevelvalue + ')';
end
else
begin
print 'no, it does not exist at the root level';
set @y.modify('insert <MyProperty>99999</MyProperty>into (/Form)[1]')
print 'so we added it.';
end
select @y