查找SQL Server表的XML列中是否存在元素

时间:2015-12-09 00:44:41

标签: sql-server xml

我将数据序列化为SQL Server表中的XML列,格式为:

tr

元素<Form title="Sample Data"> <MyProperty>1234</MyProperty> <Employee> <MyProperty>1234</MyProperty> </Employee> </Form> 可以位于根级别,也可以位于MyProperty下的子元素。

我需要的是一个SQL脚本:

  1. 检查XML的根级别是否存在<Employee>(我不关心它的子版本)
  2. 如果它不存在,请在根级别插入记录。
  3. MyProperty的值之前已经计算过,我计划将它放在临时表中,以及包含序列化XML的行的PK。

    有人可以就如何做到这一点给出一些指导吗?

1 个答案:

答案 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