如何不在XML的SQL Server中包含空元素

时间:2018-10-31 18:27:28

标签: sql-server xml

给出以下查询(这是一个更大的查询的一部分):

select  
    (select szamlatetel_id as SzamlatetelId,
            kiert_eredm as KiertEredm
     from vv_kiert K where K.vv_fej_id = 3
     order by K.id
     for xml raw('Kiertekeles'), TYPE)

此查询返回以下结果:

NULL

但是结果集应该为空。

我根本不希望看到此元素,因为该模式表明,如果我在XML中指定了此元素,则必须指定其他一些必填字段。因此,我的架构验证失败。

如何返回空结果集(非NULL)

上述查询包含在该查询中:

select  
    (select szamlatetel_id as SzamlatetelId,
            kiert_eredm as KiertEredm
     from vv_kiert K 
     where K.vv_fej_id = 3
     order by K.id
     for xml raw('Kiertekeles'), TYPE) 
for xml raw('Kiertekelesek'), ELEMENTS, TYPE

更大的查询中包含了它本身。

我根本不想看到Kiertekelesek元素。

相反,我看到了:

<Kiertekelesek />

如何避免创建Kiertekelesek元素?

2 个答案:

答案 0 :(得分:1)

您的内部查询已经满足您的要求。

 select szamlatetel_id as SzamlatetelId,
        kiert_eredm as KiertEredm
 from vv_kiert K where K.vv_fej_id = 3
 order by K.id
 for xml raw('Kiertekeles')

具有给出的结果集

<Kiertekeles szamlatetel_id="12 />

没有结果集,它给出零行

这是一个完整的示例,其中包含临时案例和数据以演示解决方案。请自己尝试。

CREATE TABLE #vv_kiert(
    id int NOT NULL,
    szamlatetel_id int  NOT NULL,
    kiert_eredm varchar(10) NOT NULL,
    vv_fej_id int NULL
) 
GO

--example 1 with 1 (non-matching) row
INSERT INTO #vv_kiert VALUES (1, 1, 'example1', 0)

-- your original query, yields 1 row, 1 col: "NULL"
select  
  (select szamlatetel_id as SzamlatetelId,
        kiert_eredm as KiertEredm
  from #vv_kiert K where K.vv_fej_id = 3
  order by K.id
  for xml raw('Kiertekeles'), TYPE)

--example 2 with 2 rows (1 matching)
INSERT INTO #vv_kiert VALUES (2, 2, 'example2', 3)

-- your original query
select  
  (select szamlatetel_id as SzamlatetelId,
        kiert_eredm as KiertEredm
  from #vv_kiert K where K.vv_fej_id = 3
  order by K.id
  for xml raw('Kiertekeles'), TYPE)
--yields 1 row, 1 col: <Kiertekeles SzamlatetelId="2" KiertEredm="example2" />

--example 3 with an empty table
DELETE FROM #vv_kiert 

-- your original query, yields 1 row 1 col: "NULL"
select  
  (select szamlatetel_id as SzamlatetelId,
        kiert_eredm as KiertEredm
  from #vv_kiert K where K.vv_fej_id = 3
  order by K.id
  for xml raw('Kiertekeles'), TYPE)

--My Solution, yields zero rows, like you requested
 select szamlatetel_id as SzamlatetelId,
        kiert_eredm as KiertEredm
 from #vv_kiert K where K.vv_fej_id = 3
 order by K.id
 for xml raw('Kiertekeles')

-- done. clean up.
DROP TABLE #vv_kiert

如果您得到不同的结果,请修改您的问题以包括这样的数据示例。

答案 1 :(得分:0)

XML为NULL时,XML将返回 no元素,但是内部查询将返回一个空元素,该元素不是NULL,因此返回外部{{1 }}将会显示出来。那是设计

您可以通过使用CTE来执行查询并通过在外部查询上放置SELECT来强制将查询总数设为NULL,从而使此技巧更上层楼。试试这个:

WHERE