如何创建更新查询以将存储为文本的 xml 值提取到新列中

Posted

技术标签:

【中文标题】如何创建更新查询以将存储为文本的 xml 值提取到新列中【英文标题】:How to create an update query to extract xml values stored as text into new columns 【发布时间】:2019-09-09 08:50:46 【问题描述】:

我有一个将 XML 存储在文本列中的现有表,因为不再需要这种格式,所以我为每个属性创建了列。

XML如下,只是一个节点:

<TimeLapse QueryID="308" IntervalType="1" GroupType="C" Accumulate="Y" FrameRate="2" StartDateTime="2009-05-20T00:00:00.0000000" />

以下是新列:

ALTER TABLE [dbo].[TimeLapse] 
ADD
    [QueryID] [int] null,
    [IntervalType] [varchar] (10) null,
    [GroupingType] [varchar](10) null,
    [Accumulate] [bit] default 'FALSE',
    [FrameRate] [int] null,
    [PeriodFixedStartDate] [datetime] NULL

我需要执行什么更新查询才能将 XML 提取到新列中?

【问题讨论】:

使用 XQUERY。你试过什么了?为什么它不起作用? 附言。考虑到节点 StartDateTime 的值精确到 1/1000000 秒,我会为您的列使用 datetime2(7),否则您将失去大量的准确度(datetime 仅精确到 1 /300 秒)。除非它具有00:00:00.0000000 的原因是因为它们都具有该值;那么你最好使用date 抱歉我的笔记本电池没电了,我现在正在打电话。我首先将 XML 文本转换为 XML,然后使用节点方法来获取特定属性,这是在黑暗中的一次失败 时间的准确性只需要到分钟,之前设计数据的人都非常雄心勃勃:) 如果只有一分钟,那么smalldatetime 似乎是一个更好的选择。 :) 【参考方案1】:

就像在 cmets 中提到的那样,您只需要使用 XQUERY 来提取值:

CREATE TABLE dbo.TimeLapse (NotXMLColumn varchar(MAX));
GO

INSERT INTO dbo.TimeLapse (NotXMLColumn)
VALUES('<TimeLapse QueryID="308" IntervalType="1" GroupType="C" Accumulate="Y" FrameRate="2" StartDateTime="2009-05-20T00:00:00.0000000" />')
GO

ALTER TABLE [dbo].[TimeLapse] 
ADD
    [QueryID] [int] null,
    [IntervalType] [varchar] (10) null,
    [GroupingType] [varchar](10) null,
    [Accumulate] [bit] default 'FALSE',
    [FrameRate] [int] null,
    [PeriodFixedStartDate] [smalldatetime] NULL;
GO

UPDATE TL
SET QueryID = XMLColumn.value('(TimeLapse/@QueryID)[1]','int'),
    [IntervalType] = XMLColumn.value('(TimeLapse/@IntervalType)[1]','varchar(10)'),
    [GroupingType] = XMLColumn.value('(TimeLapse/@GroupType)[1]','varchar(10)'),
    [Accumulate] = CASE XMLColumn.value('(TimeLapse/@Accumulate)[1]','char(1)') WHEN 'Y' THEN 1 ELSE 0 END,
    [FrameRate] = XMLColumn.value('(TimeLapse/@FrameRate)[1]','int'),
    [PeriodFixedStartDate] = XMLColumn.value('(TimeLapse/@StartDateTime)[1]','smalldatetime')
FROM dbo.TimeLapse TL
     CROSS APPLY (VALUES(CONVERT(xml,NotXMLColumn)))V(XMLColumn);

GO

SELECT *
FROM dbo.TimeLapse;

DB<>Fiddle

【讨论】:

好的,但是当 XMLColumn 是 varchar 时会有所改变 可以使用VALUES来转换FROM、@Hank中的值。不过,您确实应该将 XML 存储为 xml;毕竟,这就是数据类型。 大声笑,它不是我创建的,10 年前有人创建的,不过感谢您的帮助,我会在早上测试一下

以上是关于如何创建更新查询以将存储为文本的 xml 值提取到新列中的主要内容,如果未能解决你的问题,请参考以下文章

如何编写查询以将两个帐户及其活动日志合并为一个? [关闭]

如何更新字段以将值添加到现有值?

读取 XML 数据并构建查询以将值插入 SQL Server DB 的最佳方法是啥?

如何将存储过程查询结果输出到文本文件

从我的 c++ 应用程序调用 c# dll(解析 XML 文件)以将数组/列表返回给 c++

在 MS Access 中,创建动态查询后,如何使用记录集中的相应值更新表单上的文本框?