首页 > 解决方案 > 如果任何级别的子级或子级的子级没有实用值,则删除一个元素

问题描述

我在 SQL 服务器表中有一个 XML 列。我想删除某些元素并从该 XML 列中提取其余信息。

CREATE TABLE #TempTable (xmlDoc xml)

INSERT INTO #TempTable (xmlDoc)
SELECT TOP 1 ai.[XMLDocument].value('(/RequestInfo/TransDocument)[1]','varchar(max)') AS xmlDoc FROM [dbo].[FormDetails] WHERE  [FormID] = xyz 

如果任何级别的孩子(或孩子的孩子)没有特定值,我想删除所有这些元素。在下面给出的示例中,我想删除不等于的所有<FormDetail>元素USStateCd'NJ'

XML:

<Form>
 <FormDetail>
       <EmployeeInfoGrp>
        <OtherCompletePersonName>
          <PersonFirstNm>LALALALALI</PersonFirstNm>
          <PersonMiddleNm>S</PersonMiddleNm>
          <PersonLastNm>LILILILA</PersonLastNm>
        </OtherCompletePersonName>
        <MailingAddressGrp>
          <USAddressGrp>
            <AddressLine1Txt>108 ABCD AVE</AddressLine1Txt>
            <CityNm>SPRINGFIELD</CityNm>
            ***<USStateCd>TN</USStateCd>***
            <USZIPCd>37100</USZIPCd>
          </USAddressGrp>
        </MailingAddressGrp>
      </EmployeeInfoGrp>
  </FormDetail>

 <FormDetail>
       <EmployeeInfoGrp>
        <OtherCompletePersonName>
          <PersonFirstNm>CHACHACHACHA</PersonFirstNm>
          <PersonMiddleNm>D</PersonMiddleNm>
          <PersonLastNm>CHICHICHI</PersonLastNm>
        </OtherCompletePersonName>
        <MailingAddressGrp>
          <USAddressGrp>
            <AddressLine1Txt> EFGH AVE</AddressLine1Txt>
            <CityNm>bLah</CityNm>
            ***<USStateCd>NJ</USStateCd>***
            <USZIPCd>00111</USZIPCd>
          </USAddressGrp>
        </MailingAddressGrp>
      </EmployeeInfoGrp>
  </FormDetail>
</Form>

标签: sql-serverxmltsql

解决方案


请尝试以下方法。

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, xmldata XML);
INSERT INTO @tbl (xmldata)
VALUES
(N'<Form xmlns="urn:us:go:tr:msg:formtransmitterupstreammessage" xmlns:xsd="w3.org/2001/XMLSchema"
      xmlns:xsi="w3.org/2001/XMLSchema-instance" xmlns:abc="urn:us:gov:treasury:irs:common">
    <FormDetail xmlns="urn:us:go:tr:abc:ext:air" recordType="String" lineNum="0">
        <EmployeeInfoGrp>
            <OtherCompletePersonName>
                <PersonFirstNm>LALALALALI</PersonFirstNm>
                <PersonMiddleNm>S</PersonMiddleNm>
                <PersonLastNm>LILILILA</PersonLastNm>
            </OtherCompletePersonName>
            <MailingAddressGrp>
                <USAddressGrp>
                    <AddressLine1Txt>108 ABCD AVE</AddressLine1Txt>
                    <CityNm>SPRINGFIELD</CityNm>
                    <USStateCd>TN</USStateCd>
                    <USZIPCd>37100</USZIPCd>
                </USAddressGrp>
            </MailingAddressGrp>
        </EmployeeInfoGrp>
    </FormDetail>
    <FormDetail xmlns="urn:us:go:tr:abc:ext:air" recordType="String" lineNum="0">
        <EmployeeInfoGrp>
            <OtherCompletePersonName>
                <PersonFirstNm>CHACHACHACHA</PersonFirstNm>
                <PersonMiddleNm>D</PersonMiddleNm>
                <PersonLastNm>CHICHICHI</PersonLastNm>
            </OtherCompletePersonName>
            <MailingAddressGrp>
                <USAddressGrp>
                    <AddressLine1Txt>EFGH AVE</AddressLine1Txt>
                    <CityNm>bLah</CityNm>
                    <USStateCd>NJ</USStateCd>
                    <USZIPCd>00111</USZIPCd>
                </USAddressGrp>
            </MailingAddressGrp>
        </EmployeeInfoGrp>
    </FormDetail>
</Form>');
-- DDL and sample data population, end

-- before
SELECT * FROM @tbl;

DECLARE @state CHAR(2) = 'NJ';

;WITH XMLNAMESPACES (DEFAULT 'urn:us:go:tr:abc:ext:air'
    , 'urn:us:go:tr:msg:formtransmitterupstreammessage' AS ns1)
UPDATE @tbl
SET xmldata.modify('delete /ns1:Form/FormDetail[(EmployeeInfoGrp/MailingAddressGrp/USAddressGrp/USStateCd/text())[1] ne sql:variable("@state")]');

-- after
SELECT * FROM @tbl;

输出

<Form xmlns="urn:us:go:tr:msg:formtransmitterupstreammessage" xmlns:xsd="w3.org/2001/XMLSchema" xmlns:xsi="w3.org/2001/XMLSchema-instance" xmlns:abc="urn:us:gov:treasury:irs:common">
  <FormDetail xmlns="urn:us:go:tr:abc:ext:air" recordType="String" lineNum="0">
    <EmployeeInfoGrp>
      <OtherCompletePersonName>
        <PersonFirstNm>CHACHACHACHA</PersonFirstNm>
        <PersonMiddleNm>D</PersonMiddleNm>
        <PersonLastNm>CHICHICHI</PersonLastNm>
      </OtherCompletePersonName>
      <MailingAddressGrp>
        <USAddressGrp>
          <AddressLine1Txt>EFGH AVE</AddressLine1Txt>
          <CityNm>bLah</CityNm>
          <USStateCd>NJ</USStateCd>
          <USZIPCd>00111</USZIPCd>
        </USAddressGrp>
      </MailingAddressGrp>
    </EmployeeInfoGrp>
  </FormDetail>
</Form>

推荐阅读