Selecting null value from XML in SQL Server

前端 未结 8 1519
Happy的楠姐
Happy的楠姐 2021-02-19 20:23

I\'m trying to select from XML that has a null as one of the attributes. Instead of returning a null, it returns a 0. What am I doing wrong?
See code below to replicate:

相关标签:
8条回答
  • 2021-02-19 21:01

    http://go4answers.webhost4life.com/Example/including-null-columns-empty-elements-125474.aspx

    [not(@xsi:nil = "true")]
    

    This will select null. By the way author code has a typo

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instace"
    

    instance is misspelled as instace

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    

    Working version of author code

    declare @a xml
                select @a = '<TestSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                  <Element>
                    <Property1>1</Property1>
                    <Property2>1</Property2>
                  </Element>
                  <Element>
                    <Property1 xsi:nil="true" />
                    <Property2>2</Property2>
                  </Element>
                  <Element>
                    <Property1>3</Property1>
                    <Property2>3</Property2>
                  </Element>
                </TestSet>'
    
                 select ParamValues.TaskChainerTask.value('./Property1[1][not(@xsi:nil = "true")]','int') as Property1,
                        ParamValues.TaskChainerTask.value('./Property2[1][not(@xsi:nil = "true")]','int') as Property2
                   from @a.nodes('(/TestSet/Element)') as ParamValues(TaskChainerTask)
    
    0 讨论(0)
  • 2021-02-19 21:07

    A clever way of doing this would be to remove the Property1 node from the XML where null values are desired. So what ever node you want to be null in your result set just do not add it to the XML. In this way you will not have to add the xsi:nill attribute as well.

    So Below will also result in a null:

    declare @a xml
    select @a = '<TestSet>
      <Element>
        <Property1>1</Property1>
        <Property2>1</Property2>
      </Element>
      <Element>
         //I have removed the property1 node and this will result in a null value
        <Property2>2</Property2>
      </Element>
      <Element>
        <Property1>3</Property1>
        <Property2>3</Property2>
      </Element>
    </TestSet>'
    
     select ParamValues.TaskChainerTask.value('./Property1[1]','int') as Property1,
            ParamValues.TaskChainerTask.value('./Property2[1]','int') as Property2
       from @a.nodes('(/TestSet/Element)') as ParamValues(TaskChainerTask)
    

    It can be seen in the above example that there is no Property1 node hence it will result in a null value

    0 讨论(0)
提交回复
热议问题