【问题标题】:I can't delete empty containers in an xml document on SQL Server, such as "<Item />"我无法删除 SQL Server 上 xml 文档中的空容器,例如 \"<Item />\"
【发布时间】:2022-11-10 21:53:09
【问题描述】:

我第一次开始工作,我还不太了解,我已经为这个问题困扰了两天。

我有一个这种类型的文件:

<Tables>
  <dbo.ES_Connection_Modes>
    <Item />
  </dbo.ES_Connection_Modes>
  <dbo.ES_Device_Categories>
    <Item>
      <LINK>1</LINK>
      <F_Class>1</F_Class>
      <N_Code>1</N_Code>
      <B_Default>1</B_Default>
      <B_Meter>1</B_Meter>
      <B_Tranf>0</B_Tranf>
      <B_Regist>0</B_Regist>
      <B_Show_InMenu>1</B_Show_InMenu>
      <N_Project>-1</N_Project>
      <C_Const>EDC_Meter</C_Const>
    </Item>
  </dbo.ES_Device_Categories>
  <dbo.ES_Indicating_Device_Types>
    <Item />
  </dbo.ES_Indicating_Device_Types>
  <dbo.ES_Operating_Principles>
    <Item />
  </dbo.ES_Operating_Principles>
  <dbo.ES_Precission_Classes>
    <Item>
      <LINK>7</LINK>
      <N_Project>687783</N_Project>
      <C_Name>2,0</C_Name>
      <C_Const>EPC_20</C_Const>
    </Item>
    <Item>
      <LINK>8</LINK>
      <N_Project>687783</N_Project>
      <C_Name>2,5</C_Name>
      <C_Const>EPC_25</C_Const>
    </Item>
  </dbo.ES_Precission_Classes>
  <dbo.ES_Granularity>
    <Item />
  </dbo.ES_Granularity>
</Tables>

我需要删除空项目容器和包含它的容器以获取以下类型的文档:

<Tables>
  <dbo.ES_Device_Categories>
    <Item>
      <LINK>1</LINK>
      <F_Class>1</F_Class>
      <N_Code>1</N_Code>
      <B_Default>1</B_Default>
      <B_Meter>1</B_Meter>
      <B_Tranf>0</B_Tranf>
      <B_Regist>0</B_Regist>
      <B_Show_InMenu>1</B_Show_InMenu>
      <N_Project>-1</N_Project>
      <C_Const>EDC_Meter</C_Const>
    </Item>
  </dbo.ES_Device_Categories>
  <dbo.ES_Precission_Classes>
    <Item>
      <LINK>7</LINK>
      <N_Project>687783</N_Project>
      <C_Name>2,0</C_Name>
      <C_Const>EPC_20</C_Const>
    </Item>
    <Item>
      <LINK>8</LINK>
      <N_Project>687783</N_Project>
      <C_Name>2,5</C_Name>
      <C_Const>EPC_25</C_Const>
    </Item>
  </dbo.ES_Precission_Classes>
</Tables>

我尝试了很多东西,删除了它们,但这是我希望的方式,但我收到一个错误:

SET @myDoc.modify('delete /Tables/*[contains(name(), "null")]');

【问题讨论】:

  • 在提出问题时,您需要提供minimal reproducible example:(1)DDL 和样本数据填充,即 CREATE 表加上 INSERT T-SQL 语句。 (2) 你需要做什么,即逻辑和你的代码尝试在 T-SQL 中实现它。 (3) 期望的输出,基于上述#1 中的样本数据。 (4) 您的 SQL Server 版本 (SELECT @@version;)。

标签: sql-server xml sql-server-2014


【解决方案1】:

请尝试以下解决方案。

它正在删除根下的第二级 XML 元素() 反过来物品没有子元素的元素。

SQL

DECLARE @myDoc XML =
N'<Tables>
    <dbo.ES_Connection_Modes>
        <Item/>
    </dbo.ES_Connection_Modes>
    <dbo.ES_Device_Categories>
        <Item>
            <LINK>1</LINK>
            <F_Class>1</F_Class>
            <N_Code>1</N_Code>
            <B_Default>1</B_Default>
            <B_Meter>1</B_Meter>
            <B_Tranf>0</B_Tranf>
            <B_Regist>0</B_Regist>
            <B_Show_InMenu>1</B_Show_InMenu>
            <N_Project>-1</N_Project>
            <C_Const>EDC_Meter</C_Const>
        </Item>
    </dbo.ES_Device_Categories>
    <dbo.ES_Indicating_Device_Types>
        <Item/>
    </dbo.ES_Indicating_Device_Types>
    <dbo.ES_Operating_Principles>
        <Item/>
    </dbo.ES_Operating_Principles>
    <dbo.ES_Precission_Classes>
        <Item>
            <LINK>7</LINK>
            <N_Project>687783</N_Project>
            <C_Name>2,0</C_Name>
            <C_Const>EPC_20</C_Const>
        </Item>
        <Item>
            <LINK>8</LINK>
            <N_Project>687783</N_Project>
            <C_Name>2,5</C_Name>
            <C_Const>EPC_25</C_Const>
        </Item>
    </dbo.ES_Precission_Classes>
    <dbo.ES_Granularity>
        <Item/>
    </dbo.ES_Granularity>
</Tables>';

SET @myDoc.modify('delete /Tables/*[not(Item/*)]');

-- test
SELECT @myDoc;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-01
    • 1970-01-01
    • 2012-07-18
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多