如何不为XML查询返回空元素

时间:2019-07-12 08:39:04

标签: sql-server

我试图生成嵌套XML报告,该报告来自具有动态字段的表,并且我只想返回带有值的字段,而没有值的字段在MS SQL中用FOR XML PATH查询根本不会返回

SELECT
 T1.[Col] AS '@id'
   ,T1.[Col] AS 'Event'
   ,(SELECT 
    (SELECT 
      Col AS '@name',
      (SELECT COl FROM Table WHERE COl= Col) as '@description',
      [Col] AS '@assessment'            
      FOR XML PATH('ininrow'), TYPE)
,(SELECT 
      Col AS '@name',
      (SELECT COl FROM Table WHERE COl= Col) as '@description',
      [Col] AS '@assessment'            
      FOR XML PATH('ininrow'), TYPE)

    FOR XML PATH('InInRow'),TYPE) 


   FROM [dbo].[Table] T1

  WHERE Col=12 
FOR XML PATH('OutterRow'),TYPE 

如果ininrow元素为null,我希望生成的XML不包含空元素

<OutterRow>
   <ID>56789</ID>
    <Event>Vetting</Event>
    <InInRow>
      <InRow>
     <ininrow name="Bird" description="1: Black colar" assessment="BC2" />
     <ininrow name="Dove" description="White" assessment="W1" />
  </InRow>
 </InInRow>

但是我正在制作类似这样的东西

<OutterRow>
  <ID>56789</ID>
  <Event>Vetting</Event>
  <InInRow>
    <InRow>
     <ininrow name="Bird" description="1: Black colar" assessment="BC2" />
    <ininrow />
     </InRow>
  </InInRow>
</OutterRow>

表1

Id              
1000                
1002            



Table 2             
colA    ColB    ColC    ColD    colID
Bird    Black Colar Null    Null    1000
Dove    White   Bird    Black Colar 1002

enter image description here

1 个答案:

答案 0 :(得分:0)

出现就是您所追求的:

CREATE TABLE dbo.Table1 (ID int);
INSERT INTO dbo.Table1 (ID)
VALUES (1002),
       (1000);

CREATE TABLE dbo.Table2 (ColA varchar(20),
                         ColB varchar(20),
                         ColC varchar(20),
                         ColD varchar(20),
                         ColID int);
INSERT INTO dbo.Table2 (ColA,
                        ColB,
                        ColC,
                        ColD,
                        ColID)
VALUES ('Bird', 'Black Colar', NULL, NULL, 1000),
       ('Dove', 'White', 'Bird', 'Black Colar', 1002); 
GO

SELECT 56789 AS ID,
       'Vetting' AS [Event],
       (SELECT T2.ColA AS [@Name],
               T2.ColB AS [@Description]
               --No idea where W1/BC2 comes from, so omitted
        FROM dbo.Table2 T2 --As Table1 has 1 column, I don't see why it's needed here
        FOR XML PATH('ininrow'), ROOT('InRow'), TYPE) AS InInRow --You've already used InInRow, careful
FOR XML PATH('OutterRow')       

GO

DROP TABLE dbo.Table1;
DROP TABLE dbo.Table2;