sql - 如何创建更新查询以将存储为文本的 xml 值提取到新列中
问题描述
我有一个将 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 来提取值:
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;
推荐阅读
- javascript - 我怎样才能结合这些功能
- java - 如何在 dl4j 中正确使用我的神经网络?
- python - ipython中的time.sleep非常不准确
- angular - 带有 *ngFor 的材料表,显示列作为对象数组
- bash - SHELL:显示最早创建的文件 DATE 及其路径
- html - 仅 Safari 上的 CSS 错误
- sql-server - 在 SQL 2019 中创建外部数据源时无法生成 SSPI 上下文
- python - 旋转 x 轴标签 FacetGrid seaborn 不工作
- python - 如何在 Microsoft Word 中的图片上添加阴影图像效果
- json - 在 pandas 中读取请求的 JSON 文件