[SQL] 读 XML 格式文件写入 SQL table

范例 XML 档案格式内容如下,想抓 XML 几个栏位的资料写入 table 中,SQL 语法如下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 函 SYSTEM "104_2_utf8.dtd" [
<!ENTITY 表单 SYSTEM "0001132A00.sw" NDATA DI>
<!NOTATION DI SYSTEM "">
<!NOTATION _X SYSTEM "">
]>
<函>
	<发文机关>
		<全衔>财团法人中华民国xxx基金会</全衔>
		<机关代码>XC12345678</机关代码>
	</发文机关>
	<函类别 代码="函"/>
	<地址>10066台北市中正区南海路x号x楼</地址>
	<联络方式>承办人:XXX</联络方式>
	<联络方式>电话:02-12345678分机123</联络方式>
	<联络方式>电子信箱:[email protected]</联络方式>
	<受文者>
		<交换表 交换表单="表单">如正副本行文单位</交换表>
	</受文者>
	<发文日期>
		<年月日>中华民国109年9月8日</年月日>
	</发文日期>
	<发文字号>
		<字>证基</字>
		<文号>
			<年度>109</年度>
			<流水号>1234567</流水号>
		</文号>
	</发文字号>
	<速别 代码="普通件"/>
	<密等及解密条件或保密期限>
		<密等/>
		<解密条件或保密期限></解密条件或保密期限>
	</密等及解密条件或保密期限>
	<附件>
		<文字>无</文字>
	</附件>
	<主旨>
		<文字>台湾xxx交易所委托本基金会办理「上市柜公司xxx研讨会」,敬邀贵公司董事、监察人、公司治理主管与高阶主管参加,请查照。</文字>
	</主旨>
	<段落 段名="说明:">
		<文字></文字>
		<条列 序号="一、">
			<文字>为协助上市柜公司如何有效运用衍生性商品避险以因应系统性风险、汇率风险及原物料成本波动风险等,使企业高层了解衍生性商品避险交易之重要。台湾期货交易所委托本基金会办理本活动,全程参与之董监事及公司治理主管於活动结束後提供进修时数认证,每家上市上柜及兴柜公司至多得报名三位。</文字>
		</条列>
		<条列 序号="二、">
			<文字>办理时间地点如下:</文字>
			<条列 序号="(一)">
				<文字>时间:109年10月10日(周三)下午2时</文字>
			</条列>
			<条列 序号="(二)">
				<文字>地点:xxx会议中心感恩厅(台北市忠孝东路x段x号x楼,台北市忠孝东路与建国南路交叉口-xx大楼x楼)</文字>
			</条列>
		</条列>
		<条列 序号="三、">
			<文字>本活动请至本基会网站(https://www.xxx.org.tw)报名,额满为止,敬请踊跃报名参加。</文字>
		</条列>
	</段落>
	<正本>
		<全衔>上市上柜公司(含兴柜)</全衔>
	</正本>
	<副本>
		<全衔>台湾xx股份有限公司</全衔>
	</副本>
</函>
--新增要将 XML 读到资料写入用的 table
CREATE TABLE [dbo].[OD](
	[ODid] [nvarchar](20) NOT NULL,
	[ODdate] [nvarchar](20) NULL,
	[ODgov] [nvarchar](50) NULL,
	[ODtopic] [nvarchar](100) NULL,
 CONSTRAINT [PK_OD] PRIMARY KEY CLUSTERED 
(
	[ODid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
--读取 XML 档写入 MSSQL table
insert into OD ( ODid, ODdate, ODgov, ODtopic )
select
		ODid.文号.query('年度').value('.', 'VARCHAR(20)') + ODid.文号.query('流水号').value('.', 'VARCHAR(20)') + ODid.文号.query('支号').value('.', 'VARCHAR(20)'),
		ODdate.发文日期.query('年月日').value('.', 'VARCHAR(20)'),				
		ODgov.发文机关.query('全衔').value('.', 'VARCHAR(50)'),
		ODtopic.主旨.query('文字').value('.', 'VARCHAR(100)')
from (select CONVERT(XML, MY_XML, 2)
		from OPENROWSET(BULK 'C:\test.xml', SINGLE_BLOB) as T(MY_XML)) as T(MY_XML)
		cross apply MY_XML.nodes('函/发文字号/文号') as ODid (文号)
		cross apply MY_XML.nodes('函/发文日期') as ODdate (发文日期)
		cross apply MY_XML.nodes('函/发文机关') as ODgov (发文机关)
		cross apply MY_XML.nodes('函/主旨') as ODtopic (主旨);


<<:  [Day-13] 条件运算子以及switch小练习

>>:  资料传输格式 JSON

Day_19 htop

昨天介绍强大的Netdata资源显示工具,在openwrt 的opkg套件库中,还有满车类似的功能套...

【PHP 设计模式大头菜】策略模式 Strategy Pattern

策略模式 Strategy Pattern 策略模式,可以让物件在运作时更改其行为或算法,你可以透...

认识CSS(三):CSS选择器

选择器(Selector)是指用来选择HTML中,哪些内容要套上的样式。 依据对象的不同有不同的写法...

Chapter5 - 当一个勤劳的园丁,来修剪我们美丽的树(III)Canvas动画 让树随着读取画面长大

题外话 补充昨天忘记下的结论:不管要绘制的图案多大,都建议画(储存)在一个和原图一样大的canvas...

PVE 虚拟机 Ubuntu Server 20.04 服务器版本 安装 LibreNMS

PVE 虚拟机 Ubuntu Server 20.04 服务器版本 安装 LibreNMS PROX...