【发布时间】:2019-01-19 15:40:01
【问题描述】:
我有一张桌子(比如messages),上面有primary_key 和xml_data。我知道如何从一个xml_data 值中提取多个值,如下所示:
DECLARE @x XML = 'the XML value'
;WITH XMLNAMESPACES (
'http://somenamespace/document' AS msg,
'http://somenamespace/externalMessage' AS dat
)
SELECT c.value('(dat:delivery_list/dat:identifier)[1]', 'varchar(20)') AS dl_identifier,
c.value('(dat:created_on)[1]', 'datetime2(0)') AS created_on,
c.value('(dat:delivery_list/dat:shipping_date)[1]', 'datetime2(0)') AS shipping_date
FROM @x.nodes('/msg:data/msg:body/msg:request/msg:data/dat:operation/dat:data/dat:external_message') AS t(c)
现在,我想构建另一个表(比如heads),具有相同的primary_key,并且列dl_identifier、created_on 和shipping_date 填充了从messages.xml_data 提取的信息.它应该只处理新的messages.xml_data(尚未完成提取)。
到目前为止,我正在考虑左外连接表以检测丢失的heads 记录,如下所示:
SELECT m.primary_key,
m.xml_data
FROM messages AS m
LEFT OUTER JOIN heads AS h
ON h.primary_key = m.primary_key
AND m.xml_data IS NOT NULL
WHERE h.primary_key IS NULL
它选择想要的m.xml_data。是否可以在不使用游标的情况下将从m.xml_data(以及primary_key)提取的值插入heads?
【问题讨论】:
-
here 和
insert ... select ...的示例不能满足您的需求吗? -
旁白:用适当的软件(MySQL、Oracle、DB2...)和版本标记数据库问题很有帮助,例如
sql-server-2014。语法和功能的差异通常会影响答案。请注意,tsql缩小了选择范围,但没有指定数据库。 -
@HABO:是的,这是针对 MS SQL Server 2014 Standard (12.0.5000.0) 的。我不知道如何将 te
m.xml_data传递到上部 SELECT 中以提取值,并将其插入到另一个表中 - 对于m的每条记录。我知道如何用光标来做。但是,我不知道是否可以不使用光标。
标签: xml tsql sql-server-2014