【问题标题】:Parsing a xml string without the root elements using T-SQL使用 T-SQL 解析没有根元素的 xml 字符串
【发布时间】:2020-01-01 06:54:27
【问题描述】:

下面是存储在我的数据库表的列中的 XML 字符串,我需要使用 T-SQL 对其进行解析

Installation type:Interior

Wiring Length (ft):4

Connector type:RJ45

Location description:basement

WirelessID:1

DevID:1234567

wontTurnOff:true

由于缺少根标签和子标签,我该如何解析?

谢谢。

【问题讨论】:

  • 您没有 xml。您有一个冒号分隔的字符串(类似于 CSV,但使用冒号而不是逗号)。像 CSV 一样处理,但使用冒号作为分隔符。
  • 这不是 xml。请edit您的问题包含一个实际的xml字符串。此外,最好为您正在使用的特定 SQL Server 版本添加标签。

标签: sql-server xml tsql


【解决方案1】:

您的表格列中的数据格式似乎不是 XML 格式。它通常如下所示,列类型将设置为“XML”。请注意,有一个层次结构,与书关联的每个项目都有一个开始和结束标记。目录下可以有多本书。

<catalog>
  <book id="bk101">
     <author>Gambardella, Matthew</author>
     <title>XML Developer's Guide</title>
     <genre>Computer</genre>
     <price>44.95</price>
     <publish_date>2000-10-01</publish_date>
     <description>An in-depth look at creating applications with XML.</description>
  </book>
</catalog>

但是,在指出上述内容之后,我假设您可能正在处理一些有些不同的东西,这些东西可能最初是为 XML 源提取并放入您提供的格式中的。如果要解析的格式和七个项目是一致的(表中一条记录到下一条记录的值不同),那么这里有一个替代方案可能会有所帮助。这是一个示例,您可以将其复制到查询中并进行测试,并将其用作最终 SQL 中的参考,这可能需要为解析出的某些数值包含到整数的转换。此示例将适应与每个项目关联的值的不同长度。但是,为了使其工作,这些项​​目必须按照您在示例中提供的顺序进行。

DECLARE @string varchar(max)
SET @string = 'Installation type:Interior
Wiring Length (ft):4
Connector type:RJ45
Location description:basement
WirelessID:1
DevID:1234567
wontTurnOff:true'


DECLARE  @Installation_type varchar(50)
    ,@Wiring_Length varchar(10)
    ,@Connector_type varchar(10)
    ,@Location_Description varchar(100)
    ,@WirelessID varchar(10)
    ,@DevID varchar(10)
    ,@wontTurnOff varchar(5)

 SELECT SUBSTRING(@string, charindex('Installation type:', @string)+18, (charindex('Wiring Length (ft):', @string)-2) - (charindex('Installation type:', @string)+18))
 SELECT SUBSTRING(@string, charindex('Wiring Length (ft):', @string)+19, (charindex('Connector type:', @string)-2) - (charindex('Wiring Length (ft):', @string)+19))
 SELECT SUBSTRING(@string, charindex('Connector type:', @string)+15, (charindex('Location description:', @string)-2) - (charindex('Connector type:', @string)+15))
 SELECT SUBSTRING(@string, charindex('Location description:', @string)+21, (charindex('WirelessID:', @string)-2) - (charindex('Location description:', @string)+21))
 SELECT SUBSTRING(@string, charindex('WirelessID:', @string)+11, (charindex('DevID:', @string)-2) - (charindex('WirelessID:', @string)+11))
 SELECT SUBSTRING(@string, charindex('DevID:', @string)+6, (charindex('wontTurnOff:', @string)-2) - (charindex('DevID:', @string)+6))
 SELECT SUBSTRING(@string, charindex('wontTurnOff:', @string)+12, (len(@string)+1) - (charindex('wontTurnOff:', @string)+12))

数据以各种奇怪的格式到达是很常见的,有时它们是零散的。如果您的数据是真正的 XML 并且需要这样解析,那么您将您的值分配给临时 varchar(max) 变量,在其中为每个项目执行查找和替换(例如将“WirelessID:1”转换为“1” >) 连接最顶层 XML 标记(如初始 XML 示例中使用的“”)中的整个值,将整个 varchar(max) 值转换为 XML,然后应用 SQL 中包含的 XML 解析函数。

希望这会有所帮助。在没有看到您的数据的情况下,我只能建议这两个选项。我从事 ETL 开发已有多年,当无法控制数据源时,通常需要使用书中的每一个技巧来解决数据格式问题。

【讨论】:

    猜你喜欢
    • 2019-04-24
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多