代码之家  ›  专栏  ›  技术社区  ›  moogs

FOR XML子句/XSINIL的替代项中的空元素

  •  1
  • moogs  · 技术社区  · 14 年前

     ...
     '<field1>' +   
     case when field1 is null then '' else cast( field1 as varchar ) end +   
     '</field1>' +  
     ...
    

    为空元素生成以下XML:

     ....
     <field1></field1>
     ...
    

     SELECT field1, 
     ...
     FOR XML RAW, ELEMENTS
    

    现在,这不会为具有空值的列输出元素。我知道XSINIL:

     FOR XML RAW, ELEMENTS XSINIL
    

     ...
     <field1 xsi:nil="true" />
     ...
    

    在仍然使用FOR XML子句的情况下,对生成下面的格式有什么建议吗?

    ....
    <field1></field1>
    

    谢谢!

    3 回复  |  直到 14 年前
        1
  •  2
  •   Mikael Eriksson    10 年前

    您可以在可以有空字符串的空值的列上加倍。这些值将被串联起来,空字符串确保您始终拥有构建节点的内容。

    你需要使用 for xml path 而不是 for xml raw .

    declare @T table
    (
      Col1 int,
      Col2 int
    )
    
    insert into @T values(1, 2)
    insert into @T values(1, null)
    insert into @T values(null, 2)
    insert into @T values(null, null)
    
    select Col1,
           '' as Col1,
           Col2,
           '' as Col2
    from @T
    for xml path('row')
    

    <row>
      <Col1>1</Col1>
      <Col2>2</Col2>
    </row>
    <row>
      <Col1>1</Col1>
      <Col2></Col2>
    </row>
    <row>
      <Col1></Col1>
      <Col2>2</Col2>
    </row>
    <row>
      <Col1></Col1>
      <Col2></Col2>
    </row>
    
        2
  •  4
  •   marc_s dmck    14 年前

    一个非常简单的解决方案是:不要在元素后面指定“XSINIL”!

     FOR XML RAW, ELEMENTS
    

    在这种情况下,对于任何为NULL的值,都不会得到XML条目。

    如果您真的想要一个空的XML标记,则需要使用以下内容:

    SELECT
       ......
       ISNULL(CAST(field1 AS VARCHAR(100)), '') AS 'field1',
       ......
    FROM dbo.YourTable
    FOR XML RAW, ELEMENTS
    

    这样就变成了空的 field1

        3
  •  0
  •   Azhar    10 年前

    这样可以避免isnull的劳动

        declare @Var varchar(max)
    set @Var=(select 
    FirstName,
    LastName,
    Middldle_Name
    From Customer 
    FOR XML AUTO, ELEMENTS xsinil , ROOT('Customer')
    )
    select CONVERT(xml,REPLACE(@Var,' xsi:nil="true"',''))