在TSQL中解析XML并在属性为xsi:nil时填充为NULL

问题描述 投票:0回答:1

我已经为此工作了一段时间。

    DROP TABLE IF EXISTS XMLOpenXML
    Create Table XMLOpenXML (XMLData XML)
    INSERT INTO XMLOpenXML
    SELECT '<rootTag xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <Parameter>
        <Migrationsobjekt></Migrationsobjekt>
        <Datenbankname>dav30</Datenbankname>
        <StartZeitstempel>18.06.2019 09:30:05</StartZeitstempel>
      </Parameter>
      <Liste>
        <plan>
          <Planjahr>2018</Planjahr>
          <Kennzeichen>00 </Kennzeichen>
          <Schluessel>01 </Schluessel>
          <Bezeichnung1>Bezeichnungs 123123                                                                 </Bezeichnung1>
          <Bezeichnung2 xsi:nil="true" />
          <Bezeichnung3 xsi:nil="true" />
          <Status>1</Status>
          <Vermerk1 xsi:nil="true" ></Vermerk1>
          <Vermerk2 xsi:nil="true" ></Vermerk2>
          <Vermerk3 xsi:nil="true" ></Vermerk3>
          <Vermerk4 xsi:nil="true" ></Vermerk4>
          <Vermerk5 xsi:nil="true" ></Vermerk5>
        </plan>
        <plan>
          <Planjahr>2018</Planjahr>
          <Kennzeichen>00 </Kennzeichen>
          <Schluessel>02 </Schluessel>
          <Bezeichnung1>Bezeichnungs 123123   zeichen                                                          </Bezeichnung1>
          <Bezeichnung2 xsi:nil="true" />
          <Bezeichnung3 xsi:nil="true" />
          <Status>1</Status>
          <Vermerk1 xsi:nil="true" ></Vermerk1>
          <Vermerk2 xsi:nil="true" ></Vermerk2>
          <Vermerk3 xsi:nil="true" ></Vermerk3>
          <Vermerk4 xsi:nil="true" ></Vermerk4>
          <Vermerk5 xsi:nil="true" ></Vermerk5>
        </plan>
        <plan>
          <Planjahr>2018</Planjahr>
          <Kennzeichen>00 </Kennzeichen>
          <Schluessel>03 </Schluessel>
          <Bezeichnung1>Bezeichnungs 123123   12312345                          </Bezeichnung1>
          <Bezeichnung2 xsi:nil="1" ></Bezeichnung2>
          <Bezeichnung3 xsi:nil="1" ></Bezeichnung3>
          <Status>1</Status>
          <Vermerk1 xsi:nil="1" ></Vermerk1>
          <Vermerk2 xsi:nil="1" ></Vermerk2>
          <Vermerk3 xsi:nil="1" ></Vermerk3>
          <Vermerk4 xsi:nil="1" ></Vermerk4>
          <Vermerk5 xsi:nil="1" ></Vermerk5>
        </plan>
        <plan>
          <Planjahr>2018</Planjahr>
          <Kennzeichen>00 </Kennzeichen>
          <Schluessel>05 </Schluessel>
          <Bezeichnung1>Bezeichnungs 123123   86                                                               </Bezeichnung1>
          <Bezeichnung2 xsi:nil="1" ></Bezeichnung2>
          <Bezeichnung3 xsi:nil="1" ></Bezeichnung3>
          <Status>1</Status>
          <Vermerk1 xsi:nil="1" ></Vermerk1>
          <Vermerk2 xsi:nil="1" ></Vermerk2>
          <Vermerk3 xsi:nil="1" ></Vermerk3>
          <Vermerk4 xsi:nil="1" ></Vermerk4>
          <Vermerk5 xsi:nil="1" ></Vermerk5>
        </plan>
        <plan>
          <Planjahr>2018</Planjahr>
          <Kennzeichen>00 </Kennzeichen>
          <Schluessel>06 </Schluessel>
          <Bezeichnung1>Bezeichnungs 123123   3455                               </Bezeichnung1>
          <Bezeichnung2 xsi:nil="true" ></Bezeichnung2>
          <Bezeichnung3 xsi:nil="true" ></Bezeichnung3>
          <Status>1</Status>
          <Vermerk1 xsi:nil="true" ></Vermerk1>
          <Vermerk2 xsi:nil="true" ></Vermerk2>
          <Vermerk3 xsi:nil="true" ></Vermerk3>
          <Vermerk4 xsi:nil="true" ></Vermerk4>
          <Vermerk5 xsi:nil="true" ></Vermerk5>
        </plan>
        <plan>
          <Planjahr>2018</Planjahr>
          <Kennzeichen>00 </Kennzeichen>
          <Schluessel>07 </Schluessel>
          <Bezeichnung1>Bezeichnungs 123123   98765                                                 </Bezeichnung1>
          <Bezeichnung2 xsi:nil="true" ></Bezeichnung2>
          <Bezeichnung3 xsi:nil="true" ></Bezeichnung3>
          <Status>1</Status>
          <Vermerk1 xsi:nil="true" ></Vermerk1>
          <Vermerk2 xsi:nil="true" ></Vermerk2>
          <Vermerk3 xsi:nil="true" ></Vermerk3>
          <Vermerk4 xsi:nil="true" ></Vermerk4>
          <Vermerk5 xsi:nil="true" ></Vermerk5>
        </plan>
        <plan>
          <Planjahr>2018</Planjahr>
          <Kennzeichen>00 </Kennzeichen>
          <Schluessel>08 </Schluessel>
          <Bezeichnung1>Bezeichnungs 123123   Bezeichnungs 123123             </Bezeichnung1>
          <Bezeichnung2 xsi:nil="true" ></Bezeichnung2>
          <Bezeichnung3 xsi:nil="true" ></Bezeichnung3>
          <Status>1</Status>
          <Vermerk1 xsi:nil="true" ></Vermerk1>
          <Vermerk2 xsi:nil="true" ></Vermerk2>
          <Vermerk3 xsi:nil="true" ></Vermerk3>
          <Vermerk4 xsi:nil="true" ></Vermerk4>
          <Vermerk5 xsi:nil="true" ></Vermerk5>
        </plan>
        <plan>
          <Planjahr>2018</Planjahr>
          <Kennzeichen>00 </Kennzeichen>
          <Schluessel>09 </Schluessel>
          <Bezeichnung1>Bezeichnungs 123123   2432343           </Bezeichnung1>
          <Bezeichnung2 xsi:nil="true" ></Bezeichnung2>
          <Bezeichnung3 xsi:nil="true" ></Bezeichnung3>
          <Status>1</Status>
          <Vermerk1 xsi:nil="true" ></Vermerk1>
          <Vermerk2 xsi:nil="true" ></Vermerk2>
          <Vermerk3 xsi:nil="true" ></Vermerk3>
          <Vermerk4 xsi:nil="true" ></Vermerk4>
          <Vermerk5 xsi:nil="true" ></Vermerk5>
        </plan>
        <plan>
          <Planjahr>2018</Planjahr>
          <Kennzeichen>00 </Kennzeichen>
          <Schluessel>10 </Schluessel>
          <Bezeichnung1>Bezeichnungs 123123   zeichen                                            </Bezeichnung1>
          <Bezeichnung2 xsi:nil="true" ></Bezeichnung2>
          <Bezeichnung3 xsi:nil="true" ></Bezeichnung3>
          <Status>1</Status>
          <Vermerk1 xsi:nil="true" ></Vermerk1>
          <Vermerk2 xsi:nil="true" ></Vermerk2>
          <Vermerk3 xsi:nil="true" ></Vermerk3>
          <Vermerk4 xsi:nil="true" ></Vermerk4>
          <Vermerk5 xsi:nil="true" ></Vermerk5>
        </plan>
        <plan>
          <Planjahr>2018</Planjahr>
          <Kennzeichen>00 </Kennzeichen>
          <Schluessel>11 </Schluessel>
          <Bezeichnung1>Bezeichnungs 123123   bezeichen                                       </Bezeichnung1>
          <Bezeichnung2 xsi:nil="true" ></Bezeichnung2>
          <Bezeichnung3 xsi:nil="true" ></Bezeichnung3>
          <Status>1</Status>
          <Vermerk1 xsi:nil="true" ></Vermerk1>
          <Vermerk2 xsi:nil="true" ></Vermerk2>
          <Vermerk3 xsi:nil="true" ></Vermerk3>
          <Vermerk4 xsi:nil="true" ></Vermerk4>
          <Vermerk5 xsi:nil="true" ></Vermerk5>
        </plan>
        <plan>
          <Planjahr>2018</Planjahr>
          <Kennzeichen>00 </Kennzeichen>
          <Schluessel>12 </Schluessel>
          <Bezeichnung1>Bezeichnungs 123123   12345                                    </Bezeichnung1>
          <Bezeichnung2 xsi:nil="true" ></Bezeichnung2>
          <Bezeichnung3 xsi:nil="true" ></Bezeichnung3>
          <Status>1</Status>
          <Vermerk1 xsi:nil="true" ></Vermerk1>
          <Vermerk2 xsi:nil="true" ></Vermerk2>
          <Vermerk3 xsi:nil="true" ></Vermerk3>
          <Vermerk4 xsi:nil="true" ></Vermerk4>
          <Vermerk5 xsi:nil="true" ></Vermerk5>
        </plan>
        <plan>
          <Planjahr>2018</Planjahr>
          <Kennzeichen>00 </Kennzeichen>
          <Schluessel>13 </Schluessel>
          <Bezeichnung1>Bezeichnungs 123123   zeich                       </Bezeichnung1>
          <Bezeichnung2 xsi:nil="true" ></Bezeichnung2>
          <Bezeichnung3 xsi:nil="true" ></Bezeichnung3>
          <Status>1</Status>
          <Vermerk1 xsi:nil="true" ></Vermerk1>
          <Vermerk2 xsi:nil="true" ></Vermerk2>
          <Vermerk3 xsi:nil="true" ></Vermerk3>
          <Vermerk4 xsi:nil="true" ></Vermerk4>
          <Vermerk5 xsi:nil="true" ></Vermerk5>
        </plan>
        <plan>
          <Planjahr>2018</Planjahr>
          <Kennzeichen>00 </Kennzeichen>
          <Schluessel>15 </Schluessel>
          <Bezeichnung1>Bezeichnungs 123123   sdsddsd                                                </Bezeichnung1>
          <Bezeichnung2 xsi:nil="true" ></Bezeichnung2>
          <Bezeichnung3 xsi:nil="true" ></Bezeichnung3>
          <Status>1</Status>
          <Vermerk1 xsi:nil="true" ></Vermerk1>
          <Vermerk2 xsi:nil="true" ></Vermerk2>
          <Vermerk3 xsi:nil="true" ></Vermerk3>
          <Vermerk4 xsi:nil="true" ></Vermerk4>
          <Vermerk5 xsi:nil="true" ></Vermerk5>
        </plan>
        <plan>
          <Planjahr>2018</Planjahr>
          <Kennzeichen>00 </Kennzeichen>
          <Schluessel>20 </Schluessel>
          <Bezeichnung1>Bezeichnungs 123123   dedaz                                                               </Bezeichnung1>
          <Bezeichnung2 xsi:nil="true" ></Bezeichnung2>
          <Bezeichnung3 xsi:nil="true" ></Bezeichnung3>
          <Status>1</Status>
          <Vermerk1 xsi:nil="true" ></Vermerk1>
          <Vermerk2 xsi:nil="true" ></Vermerk2>
          <Vermerk3 xsi:nil="true" ></Vermerk3>
          <Vermerk4 xsi:nil="true" ></Vermerk4>
          <Vermerk5 xsi:nil="true" ></Vermerk5>
        </plan>
        <plan>
          <Planjahr>2018</Planjahr>
          <Kennzeichen>00 </Kennzeichen>
          <Schluessel>21 </Schluessel>
          <Bezeichnung1>Bezeichnungs 123123   gt            </Bezeichnung1>
          <Bezeichnung2 xsi:nil="true" ></Bezeichnung2>
          <Bezeichnung3 xsi:nil="true" ></Bezeichnung3>
          <Status>1</Status>
          <Vermerk1 xsi:nil="true" ></Vermerk1>
          <Vermerk2 xsi:nil="true" ></Vermerk2>
          <Vermerk3 xsi:nil="true" ></Vermerk3>
          <Vermerk4 xsi:nil="true" ></Vermerk4>
          <Vermerk5 xsi:nil="true" ></Vermerk5>
        </plan>
        <plan>
          <Planjahr>2018</Planjahr>
          <Kennzeichen>00 </Kennzeichen>
          <Schluessel>25 </Schluessel>
          <Bezeichnung1>Bezeichnungs 123123   zttr                                 </Bezeichnung1>
          <Bezeichnung2 xsi:nil="true" ></Bezeichnung2>
          <Bezeichnung3 xsi:nil="true" ></Bezeichnung3>
          <Status>1</Status>
          <Vermerk1 xsi:nil="true" ></Vermerk1>
          <Vermerk2 xsi:nil="true" ></Vermerk2>
          <Vermerk3 xsi:nil="true" ></Vermerk3>
          <Vermerk4 xsi:nil="true" ></Vermerk4>
          <Vermerk5 xsi:nil="true" ></Vermerk5>
        </plan>
        <plan>
          <Planjahr>2018</Planjahr>
          <Kennzeichen>00 </Kennzeichen>
          <Schluessel>27 </Schluessel>
          <Bezeichnung1>fdsBezeichnungs 123123                                 </Bezeichnung1>
          <Bezeichnung2 xsi:nil="true" ></Bezeichnung2>
          <Bezeichnung3 xsi:nil="true" ></Bezeichnung3>
          <Status>1</Status>
          <Vermerk1 xsi:nil="true" ></Vermerk1>
          <Vermerk2 xsi:nil="true" ></Vermerk2>
          <Vermerk3 xsi:nil="true" ></Vermerk3>
          <Vermerk4 xsi:nil="true" ></Vermerk4>
          <Vermerk5 xsi:nil="true" ></Vermerk5>
        </plan>
        <plan>
          <Planjahr>2018</Planjahr>
          <Kennzeichen>00 </Kennzeichen>
          <Schluessel>29 </Schluessel>
          <Bezeichnung1>1314Bezeichnungs 123123                                  </Bezeichnung1>
          <Bezeichnung2 xsi:nil="true" ></Bezeichnung2>
          <Bezeichnung3 xsi:nil="true" ></Bezeichnung3>
          <Status>1</Status>
          <Vermerk1 xsi:nil="true" ></Vermerk1>
          <Vermerk2 xsi:nil="true" ></Vermerk2>
          <Vermerk3 xsi:nil="true" ></Vermerk3>
          <Vermerk4 xsi:nil="true" ></Vermerk4>
          <Vermerk5 xsi:nil="true" ></Vermerk5>
        </plan>
        <plan>
          <Planjahr>2018</Planjahr>
          <Kennzeichen>00 </Kennzeichen>
          <Schluessel>30 </Schluessel>
          <Bezeichnung1>234rwBezeichnungs 123123                                   </Bezeichnung1>
          <Bezeichnung2 xsi:nil="true" ></Bezeichnung2>
          <Bezeichnung3 xsi:nil="true" ></Bezeichnung3>
          <Status>1</Status>
          <Vermerk1 xsi:nil="true" ></Vermerk1>
          <Vermerk2 xsi:nil="true" ></Vermerk2>
          <Vermerk3 xsi:nil="true" ></Vermerk3>
          <Vermerk4 xsi:nil="true" ></Vermerk4>
          <Vermerk5 xsi:nil="true" ></Vermerk5>
        </plan>
      </Liste>
    </rootTag>'
    /****** Object:  Table [dbo].[IMP_PLEPL_KO]    Script Date: 22.11.2019 16:14:17 ******/
    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO
    DROP TABLE IF EXISTS [dbo].[IMP_]
    CREATE TABLE [dbo].[IMP_](
        [ID] [int] IDENTITY(1,1) NOT NULL,
        [Planjahr] [int] NULL,
        [Kennzeichen] [nvarchar](max) NULL,
        [Bezeichnung1] [nvarchar](max) NULL,
        [Bezeichnung2] [nvarchar](max) NULL,
        [Bezeichnung3] [nvarchar](max) NULL,
        [Status] [nvarchar](max) NULL,
        [Vermerk1] [int] NULL,
        [Vermerk2] [int] NULL,
        [Vermerk3] [int] NULL,
        [Vermerk4] [int] NULL,
        [Vermerk5] [int] NULL,
        [Schluessel] [nvarchar](max) NULL
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    GO
    DECLARE @XML AS XML, @hDoc AS INT, @SQL NVARCHAR (MAX)
    ;WITH XMLNAMESPACES (DEFAULT 'http://www.w3.org/2001/XMLSchema-instance')  
    SELECT @XML = XMLData FROM XMLOpenXML
    EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML, '<rootTag xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>'



    INSERT INTO [dbo].[IMP_] (
          [Planjahr]
          ,[Kennzeichen]
          ,[Bezeichnung1]
          ,[Bezeichnung2]
          ,[Bezeichnung3]
          ,[Status]
          ,[Vermerk1]
          ,[Vermerk2]
          ,[Vermerk3]
          ,[Vermerk4]
          ,[Vermerk5]
          ,[Schluessel])
    SELECT *
    FROM OPENXML(@hDoc, '/rootTag/Liste/plan', 1)
    WITH 
    (
        Planjahr int ,
        Kennzeichen nvarchar(max) ,
        Bezeichnung1 nvarchar(max) ,
        Bezeichnung2 nvarchar(max) ,
        Bezeichnung3 nvarchar(max) ,
        Status nvarchar(max) ,
        Vermerk1 int ,
        Vermerk2 int ,
        Vermerk3 int ,
        Vermerk4 int ,
        Vermerk5 int ,
        Schluessel nvarchar(max) 
    )

    EXEC sp_xml_removedocument @hDoc
    GO

此代码创建一个表,每列中都有NULL。enter image description here

如果更改参数-

FROM OPENXML(@hDoc, '/rootTag/Liste/plan', 1)

FROM OPENXML(@hDoc, '/rootTag/Liste/plan', 2)

表中填充了正确的内容值,BUT用0代替[int]对象为NULL,用“”代替[nvarchar]对象为NULL

我的方法有什么问题?我想用XML内容填充我的表,如果有xsi:nil attritube,则应该用NULL填充。

谢谢,ITsab

xml tsql null xml-parsing ssms
1个回答
0
投票
首先要说明一些事情:
© www.soinside.com 2019 - 2024. All rights reserved.