VFP发送XML与MSSQL的互操作, 解决一个传大表查询的大大大问题

news2025/7/14 15:30:06

瓜哥有个需求场景,比如要按订单号查一批订单,数量2w个,如果用in拼接要写好长的语句,用string_split又限制长度8000。所以想想有什么什么好招。

瓜哥就是MYFLL作者木瓜大侠

那就可以传入XML,让MSSQL把XML解析成表,然后连接查询返回结果。

1. XML扫盲

先讲本质,打破神秘感。XML就是字符串,跟JSON一样,一种特殊规范的字符串,它跟HTML语言一样,是用<> 来表示键值对的结构,这个叫标签,比如最简单的结构:

<姓名>张三</姓名>  //XML 标签名(key键) 姓名,标签值(value值) 张三 
{"姓名":"张三"}  //JSON

XML和JSON都是表示姓名:张三的键值对。

更专业的定义,请善用搜索引擎。

表的数据结构

idname
1张三
2李四

**XML表示方法一:**标签值法

<row>
  <id>1</id><name>张三</name>
  <id>2</id><name>李四</name>
</row>

**XML表示方法二:**标签行属性法

还有一种就是把每行的字段放在标签属性中

<row id="1" name="张三"></row>
<row id="2" name="李四"></row>

2. 将MSSQL单表生成XML

SELECT * FROM SPU FOR XML RAW,ELEMENTS	

查询结果如下:

image-20221119100817965

可以看到,每一行记录都是键值对的形式,然后被 row的键包着。

FOR XML RAW 表示 用RAW模式生成,这个参数默认是生成如下行属性的格式,不是我们想要的XML格式。

<row id="22" image="images/goods/20220909120216336481.jpg" spucode="100009002118                                " goodname="家乐浓香鸡味调味料-1*20kg" goodintroduced="1112" gooddeail="111" typeid="1" />

加个ELEMENTS参数就可以生成我们想要的XML格式了。

原来每一行是ROW标签,现在我们想换一个,只需要在RAW 后面加一个参数

SELECT * FROM SPU FOR XML RAW('item'),ELEMENTS	

image-20221119103757070

我们还可以将表名做为最外层的根结点

image-20221119103936637

其实上面代码也可以写成如下:

SELECT * FROM SPU FOR XML path('item'),root('spu')

用path参数,就不用加ELEMENTS关键字了,少写一个是一个。

3. 将XML生成表

标签值法

方法1:

-- -- 也可以用varchar,与nvarchar 如果是有汉字要定义成nvarchar,不然会出错
Declare @cxml as xml
set @cxml='
<rows>
 <row>
   <id>1</id>
   <name>张三</name>
 </row>
  <row>
   <id>2</id>
   <name>李四</name>
 </row>
</rows> 
'

DECLARE @xmlDoc integer
-- sp_xml_preparedocument存储过程用来创建XML结构
EXEC sp_xml_preparedocument @xmlDoc OUTPUT, @cxml

-- OPENXML 参数2 代表是rows/row数据行所在路径,参数3:不能错,用的是标签值转换方式
-- with 语句定义数据类型

SELECT * FROM
OPENXML (@xmlDoc, 'rows/row', 2)
WITH
(id int ,
name varchar(50)
)

-- 用完移除xml变量
exec sp_xml_removedocument @xmlDoc

OPENXML (@xmlDoc, ‘rows/row’, 2)内的rows/row 结构是跟XML内容是对应的

方法二:

Declare @cxml as  xml
set @cxml='
<rows>
 <row>
   <id>1</id>
   <name>张三</name>
 </row>
  <row>
   <id>2</id>
   <name>李四</name>
 </row>
</rows> 
'
SELECT
		x.item.value('id[1]','int') as id ,
        x.item.value('name[1]', 'nVARCHAR(100)') as name
		FROM @cxml.nodes('//rows/row') AS x(item)

标签行属性法

-- 也可以用varchar,与nvarchar 如果是有汉字要定义成nvarchar,不然会出错
Declare @cxml as  xml 
set @cxml='
<rows>
 <row id="1" name="张三" />
 <row id="2" name="李四" />
</rows> 
'

DECLARE @xmlDoc integer
-- sp_xml_preparedocument存储过程用来创建XML结构
EXEC sp_xml_preparedocument @xmlDoc OUTPUT, @cxml

-- OPENXML 参数2 代表是rows/row数据行所在路径,参数3:不能错,用的是标签值转换方式
-- with 语句定义数据类型

SELECT * FROM
OPENXML (@xmlDoc, 'rows/row', 1)
WITH
(id int ,
name varchar(50)
)
-- 用完移除xml变量
exec sp_xml_removedocument @xmlDoc

方法二:

Declare @cxml as xml
set @cxml='
<rows>
 <row id="1" name="张三" />
 <row id="2" name="李四" />
</rows> 
'

SELECT
		x.item.value('@id', 'int') AS id,
        x.item.value('@name', 'VARCHAR(100)') AS name
		FROM @cxml.nodes('//rows/row') AS x(item)

x(item) 相当于表名, 也可以把值赋给变量 @值=x.item.value(‘@id’, ‘int’)

标签值和标签行属性XML的方法二差异在如下

	//标签值法
	x.item.value('id[1]','int') 
    x.item.value('name[1]', 'VARCHAR(100)') 
    
	//标签行属性法
	x.item.value('@id', 'int') AS id,
    x.item.value('@name', 'VARCHAR(100)') AS name

这是一种叫XQUERY的查询语法。

declare @XML xml = '
<ListOrderItem>
 <OrderItem>
  <Item>
   <Seller>1</Seller>
  </Item>
  <Item>
   <Seller>2</Seller>
  </Item>
 </OrderItem> 
</ListOrderItem>'
-- 第二行数据
declare @I int = 1
select @XML.value('(ListOrderItem[1]/OrderItem[1]/Item[sql:variable("@I")]/Seller[1])[1]','VARCHAR(64)')

对了,忘记写VFP了,

  1. 做存储过程,VFP发送SQLEXEC函数指令调用它。

  2. 做成T-SQL指令发送过去。

好了,今天的内容写完了,花的时间不少来验证。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/17729.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【实验十二】决策树判断你是否可学python

一、实验目的 1.熟练安装scikit-learn扩展库(本库有许多依赖库&#xff0c;如该库建立在NumPy&#xff0c;SciPy和matplotlib之上&#xff0c;一般要先安装这些扩展库后&#xff0c;再安装。当然在线安装的话也会一次性将依依赖库安装完&#xff0c;前提是这些库的网站能连上)…

(杂谈)世界上本没什么prompt,有的只是加权平均——关于NLP中embedding的一点思考

&#xff08;杂谈&#xff09;世界上本没什么prompt&#xff0c;有的只是加权平均——关于NLP中embedding的一点思考0. 写在前面1. 问题的提出2. 备受嫌弃的NSP&#xff0c;为什么效果不佳2. 比句子更小的片段——Span Bert3. 更加纯粹的表示方法——PURE4. 风光无限的prompt&a…

编写bat脚本调用hexview进行软件签名

上一篇《编写Bat脚本调用Vecotr工具软件HexView》介绍了如何使用bat脚本编写Bat脚本调用Vecotr工具软件HexView进行文件合并、填充、AES加密、SHA256哈希校验等基本操作&#xff0c;这篇介绍一下编写bat脚本调用hexview进行软件签名的具体用法&#xff0c;在编程过程中体会代码…

Linux--shell脚本详解

目录 一、shell脚本的类型 二、read命令 三、数组 3.1 定义数组 3.2 赋值数组元素 3.3 取得元素个数 3.4 取得单个元素长度 3.5 取消或删除数组中的元素 四、赋值时使用引号的作用 五、位置参数 5.1 $* 和 $的区别 六、预定义变量 七、变量的算术运算 7.1 双小括…

[一篇读懂]C语言三讲:选择、循环

[一篇读懂]C语言三讲&#xff1a;选择、循环1. 选择if-else讲解1 关系表达式与逻辑表达式计算表达式的过程2 if-else语句【例】判断输入值是否大于02. 循环while&#xff0c;for讲解&#xff0c;continue&#xff0c;break讲解1 while循环【例】计算1到100之间所有整数之和2 fo…

【MySQL进阶】B+树索引的使用

【MySQL进阶】B树索引的使用 文章目录【MySQL进阶】B树索引的使用一、索引的代价二、B树索引适用的条件1、全值匹配2、匹配左边的列3、匹配列前缀4、匹配范围值5、精确匹配某一列并范围匹配另外一列6、用于排序7、用于分组三、回表的代价1、回表的代价2、覆盖索引四、如何挑选索…

论文管理系统(登录功能)

目录 一、后端部分 1.1 实体类 1.2 UserMapper类 1.3 Service层 接口 实现类 1.4 controller层 1.5 拦截器 二、前端部分 效果图 源码如下 代码讲解 准备工作和数据库都已经准备好了,接下来我们来写登录功能,登录功能我们通过mybatisplus来码写,所以不需要在UserMapper.…

台灯到底对眼睛好不好?2022精选眼科医生推荐护眼灯

台灯是我们最常见的照明工具了&#xff0c;台灯对眼睛会有一定的伤害的&#xff0c;光对人的视觉会产生一些影响的&#xff0c;选择质量过关的护眼台灯&#xff0c;对人的眼睛伤害是比较小的&#xff0c;基本上在光照进行优化&#xff0c;做到无可视频闪、无眩光等&#xff0c;…

巯基化PEG试剂——N3-PEG-SH,Azide-PEG-Thiol,叠氮-聚乙二醇-巯基

巯基化PEG化学试剂叠氮-聚乙二醇-巯基&#xff0c;其英文名为Azide-PEG-Thiol&#xff08;N3-PEG-SH&#xff09;&#xff0c;它所属分类为Azide PEG Thiol PEG。 此peg试剂的分子量均可定制&#xff0c;有&#xff1a;5k N3-PEG-SH、20k 叠氮-聚乙二醇-巯基、10k N3-PEG-SH、…

[11]重绘与回流

在看今天的分享之前&#xff0c;希望大家先关注一下&#xff0c;因为你可以免费获取一枚前端路上的陪跑师。 什么是回流 回流&#xff1a;英文是reflow 当render tree中的一部分(或全部)&#xff0c;因为元素的规模尺寸、布局、隐藏等改变 而需要重新构建&#xff0c;这就是回流…

基于web在线餐饮网站的设计与实现——蛋糕甜品店铺(HTML+CSS+JavaScript)

&#x1f468;‍&#x1f393;静态网站的编写主要是用HTML DIVCSS JS等来完成页面的排版设计&#x1f469;‍&#x1f393;,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等&#xff0c;用的最多的还是DW&#xff0c;当然不同软件写出的…

你的新进程是如何被内核调度执行到的?(上)

所谓的运行队列到底长什么样子、新进程是如何被加入进来的、调度是如何选择一个新进程的、新进程又如何被切换到 CPU 上运行的&#xff0c;这些细节咱们都没提到。今天就来展开看看这些进程运行背后的原理。 通过今天的文章&#xff0c;你将对以下两个问题有个更深入的理解。 …

mysql高手进阶优化篇

​MySql理论 逻辑架构 连接层-->服务层-->引擎层-->存储层 存储引擎 查看方式 1.查看mysql现在提供的搜索引擎--->show engines 2.查看mysql当前默认存储引擎show variables like storageenginestorage_enginestorageengine 存储引擎对比 MyISAM: BTree叶节…

Vue快速入门二:Vue绑定事件、Vue中的this指向、增加class选择器、动态创建标签

Vue定义点击事件&#xff1a; <body><div id"box"><button click"handleChange()">change</button></div><script>var vm new Vue({el:"#box",//定义方法methods:{//handleChange:function(){}//简写法&a…

数据结构:单链表

用&#xff08;带头节点&#xff09;单链表完成图书统计。节点结构包括书籍编号&#xff0c;书籍名以及对应作者。功能包括增加&#xff08;尾插法和指定位置插入法&#xff09;、删除、修改、查看。 一、定义节点结构 每一个节点都包括这些变量&#xff0c;构造器复杂将传入的…

去除 Zotero + Obsidian 复制粘贴参考文献表时的多余空行(ctrl+shift+C)

前言 最近在用 Zotero 做文献管理&#xff0c;用 Obsidian 记笔记。但是使用的时候&#xff0c;有一个问题不大&#xff0c;但是有时候很烦人的情况&#xff1a;粘贴参考文献格式。在粘贴的时候总会莫名多出来几个空行&#xff0c;需要手动删除。 举个例子&#xff1a; 下面…

蚂蚁链牵头两项区块链国际标准在ITU成功立项

近日&#xff0c;国际电信联盟第十六研究组&#xff08;简称ITU-T SG16&#xff09;召开全体会议。会上&#xff0c;由蚂蚁链牵头的两项区块链国际标准获得立项通过。包括&#xff1a; ITU-T H.DLT-SCLMR “Smart contract lifecycle management requirements for distributed…

Arduino开发实例-PS/2键盘驱动

PS/2键盘驱动 1、PS/2通信协议介绍 物理 PS/2 端口是 6 针 DIN 连接器。 连接器引脚如下所示: Vcc/Ground 为设备提供电源 (5V),而 Data 和 Clock 是两条集电极开路线,带有上拉电阻到 Vcc。 电阻值并不重要(1 – 10 KOhm),最小值给出最短的上升时间,而较大的值允许更少…

AES简写

一、简介引入 密码学中的高级加密标准&#xff08;Advanced Encryption Standard&#xff0c;AES&#xff09;&#xff0c;又称Rijndael加密法&#xff0c;是美国联邦政府采用的一种区块加密标准。 这个标准用来替代原先的DES&#xff08;Data Encryption Standard&#xff0…

kingdee漏洞存在多个安全漏洞(通用管理账号+获得数据库密码+远程代码执行)

kingdee漏洞详情,金蝶eas存在通用管理账号获得数据库密码漏洞&#xff0c;金蝶apusic存在远程代码执行漏洞。 下面的信息希望乌云在确认漏洞予以模糊处理&#xff0c;以免对厂商和用户产生不良影响&#xff1a; 漏洞一、金蝶eas系统存在一个默认的管理员账号admr&#xff0c;密…