您的表格列中的数据格式似乎不是 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 开发已有多年,当无法控制数据源时,通常需要使用书中的每一个技巧来解决数据格式问题。