如何创建更新查询以将存储为文本的 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 的最佳方法是啥?