前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >VFP发送XML与MSSQL的互操作, 解决一个传大表查询的大大大问题

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

作者头像
加菲猫的VFP
发布于 2023-01-03 08:47:32
发布于 2023-01-03 08:47:32
79700
代码可运行
举报
文章被收录于专栏:加菲猫的VFP加菲猫的VFP
运行总次数:0
代码可运行

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

顺嘴提一句,瓜哥就是MYFLL作者木瓜大侠

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

1. XML扫盲

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <姓名>张三</姓名> //XML 标签名(key键) 姓名,标签值(value值) 张三 
 {"姓名":"张三"} //JSON

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

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

表的数据结构

id

name

1

张三

2

李四

XML表示方法一:标签值法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <row>
  <id>1</id><name>张三</name>
  <id>2</id><name>李四</name>
 </row>

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <row id="1" name="张三"></row>
 <row id="2" name="李四"></row>

2. 将MSSQL单表生成XML

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT * FROM SPU FOR XML RAW,ELEMENTS

查询结果如下:

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <row id="22" image="images/goods/20220909120216336481.jpg" spucode="100009002118                               " goodname="家乐浓香鸡味调味料-1*20kg" goodintroduced="1112" gooddeail="111" typeid="1" />加个ELEMENTS参数就可以生成我们想要的XML格式了。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 SELECT * FROM SPU FOR XML RAW('item'),ELEMENTS

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 SELECT * FROM SPU FOR XML path('item'),root('spu')

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

3. 将XML生成表

标签值法

方法1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 -- -- 也可以用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内容是对应的

方法二:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)

标签行属性法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 -- 也可以用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

方法二:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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的方法二差异在如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//标签值法
 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的查询语法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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指令发送过去。

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-11-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 加菲猫的VFP 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
五万字 | 耗时一个月,整理出这份Hadoop吐血宝典
一、HDFS 二、MapReduce 三、Yarn 四、Hadoop3.x 新特性 五、Hadoop 大厂面试真题解析
五分钟学大数据
2021/10/26
1.7K0
大数据知识总结(三):Hadoop之Yarn重点架构原理
Apache Hadoop Yarn(Yet Another Reasource Negotiator,另一种资源协调者)是Hadoop2.x版本后使用的资源管理器,可以为上层应用提供统一的资源管理平台。
Lansonli
2025/05/24
1100
资源管理与调度系统YARN
YARN作为一个通用的资源管理系统,目标是将短作业和长服务混合部署到一个集群中,并为他们提供统一的资源管理和调度功能,概括起来主要解决以下两个问题:1.提高集群资源利用率,2.服务自动化部署。
凹谷
2020/04/11
1.3K0
yarn详解
其中,在master node上运行ResourceManager。 每个datanode上运行一个NodeManager。 并把该dataNode上的所有计算资源(CPU、内存)视为一个/多个Container,而Container可以被分配执行一个task(ApplicationMaster、map task、reduce task等)。
平凡的学生族
2019/05/25
2.3K0
Hadoop 之 Yarn
“Yarn 全称 Yet Another Resource Negitiator,就是另一种资源调度器,主要负责Hadoop集群内任务的资源调度框架。”
搬砖俱乐部
2019/10/24
7660
Hadoop 之 Yarn
想了解Hadoop?看懂这篇文章就够了
2011年的时候我们在百度搜索Hadoop相关的问题每天只有零星几个,2015年再去百度搜索Hadoop已经有800多万个问题,而如今已然已经过亿了,Hadoop已成为大数据必备的基础设施了。Hadoop被公认是一套行业大数据标准开源软件,在分布式环境下提供了海量数据的处理能力。几乎所有主流厂商都围绕Hadoop开发工具、开源软件、商业化工具和技术服务。近年大型IT公司,如EMC、Microsoft、Intel、Teradata、Cisco都明显增加了Hadoop方面的投入。那么到底什么是Hadoop?它有什么作用?它的基础架构是怎么样的?今天就Hadoop的这些基本概念来做一次简单的梳理。
袋鼠云数栈
2021/05/14
4520
想了解Hadoop?看懂这篇文章就够了
大数据面试杀招——Hadoop高频考点,正在刷新你的认知!
上一篇文章为大家总结了一些关于Hive的热门考点,得到了一些朋友的肯定与转发,菌菌就觉得花时间去做这些知识整合是非常有价值,有意义的一件事。本篇文章,让我们有幸一起来阅读一下,该怎么准备Hadoop的内容,才有机会在面试过程占据上风。
大数据梦想家
2021/01/27
7440
大数据面试杀招——Hadoop高频考点,正在刷新你的认知!
大数据面试题百日更新_Hadoop专题_Yarn专题(Day11)
YARN 的基本设计思想是将 MapReduce V1 中的 JobTracker 拆分为两个独立的服务:ResourceManager 和 ApplicationMaster。ResourceManager 负责整个系统的资源管理和分配,ApplicationMaster 负责单个应用程序的的管理。 1)ResourceManager: RM 是一个全局的资源管理器,负责整个系统的资源管理和分配,它主要由两个部分组成:调度器(Scheduler)和应用程序管理器(Application Manager)。 调度器根据容量、队列等限制条件,将系统中的资源分配给正在运行的应用程序, 在保证容量、公平性和服务等级的前提下,优化集群资源利用率,让所有的资源都被充分利用应用程序管理器负责管理整个系统中的所有的应用程序,包括应用程序的提交、与调度器协商资源以启动 ApplicationMaster、监控 ApplicationMaster 运行状态并在失败时重启它。
Maynor
2021/04/09
3410
精选Hadoop高频面试题17道,附答案详细解析(好文收藏)
hadoop中常问的就三块,第一:分布式存储(HDFS);第二:分布式计算框架(MapReduce);第三:资源调度框架(YARN)。
五分钟学大数据
2021/05/27
1.3K0
Hadoop YARN学习之组件功能简述(3)
本文介绍了Hadoop YARN学习之组件功能简述,包括ResourceManager、NodeManager和ApplicationMaster等组件,以及它们之间的协作和通信。同时,还介绍了YARN的调度组件,包括FIFO、Capacity和Fair。最后,文章提到MapReduce只是YARN中的一种应用程序框架,在YARN环境下,其他框架已经可以使用或者正在开发中。
王小雷
2018/01/02
6690
2022年Hadoop面试题最全整理,两万字干货分享【建议收藏】
Hadoop 中常问的就三块,第一:分布式存储(HDFS);第二:分布式计算框架(MapReduce);第三:资源调度框架(YARN)。
Maynor
2023/02/01
1.2K0
yarn 学习笔记(对比 kubernetes 调度)
ApplicationMaster(AM),用户提交的每个应用程序都需要包含一个AM, 作用为:
王磊-字节跳动
2020/11/03
4.5K0
hadoop之yarn调度
在大数据的生态中,hdfs解决了海量数据的存储问题,mapreduce解决了海量数据的计算问题,而在任务的执行和资源统一管理层面,则是使用yarn进行统一调度。
SRE运维实践
2021/03/04
7240
hadoop之yarn调度
深入浅出学大数据(五)Hadoop再探讨High Availability(HA)集群搭建及YARN原理介绍
此系列主要为我的学弟学妹们所创作,在某些方面可能偏基础。如果读者感觉较为简单,还望见谅!如果文中出现错误,欢迎指正~ 本文主要介绍了Hadoop再探讨High Availability(HA)及YARN原理介绍,除此之外还有High Availability(HA)集群搭建的具体搭建过程。
不温卜火
2021/11/24
1.4K0
深入浅出学大数据(五)Hadoop再探讨High Availability(HA)集群搭建及YARN原理介绍
快速、安全、可靠!Yarn!| MTdata小讲堂
Yarn 的全称是 Yet Anther Resource Negotiator(另一种资源协商者)。它作为 Hadoop 的一个组件,官方对它的定义是一个工作调度和集群资源管理的框架。关于 Yarn 的发展历史我们在之前的文章曾介绍过,在这里就不赘述了。
美图数据技术团队
2018/09/18
5980
快速、安全、可靠!Yarn!| MTdata小讲堂
Yarn快速系列入门(4) | Yarn调度器
  yarn我们都知道主要是用于做资源调度,任务分配等功能的,那么在hadoop当中,究竟使用什么算法来进行任务调度就需要我们关注了,hadoop支持好几种任务的调度方式,不同的场景需要使用不同的任务调度器.
不温卜火
2020/10/28
1.8K0
Yarn快速系列入门(4) | Yarn调度器
带你快速认识NamenodeHA和Yarn HA,为搭建HadoopHA集群打下基础!
本篇博客,博主主要为大家介绍的是什么是NamenodeHA 和 Yarn HA。并在下一篇博客中为大家带来关于搭建HadoopHA集群的详细步骤!
大数据梦想家
2021/01/27
7880
带你快速认识NamenodeHA和Yarn HA,为搭建HadoopHA集群打下基础!
Hadoop 2.0:主流开源云架构(三)
  Common的定位是其他模块的公共组件,定义了程序员取得集群服务的编程接口,为其他模块提供公用API。降低Hadoop设计的复杂性,减少了其他模块之间的耦合性,增强了Hadoop的健壮性。
Francek Chen
2025/01/23
1770
Hadoop 2.0:主流开源云架构(三)
进击大数据系列(五):Hadoop 统一资源管理和调度平台 YARN
Apache Yarn(Yet Another Resource Negotiator的缩写)是hadoop集群资源管理器系统,Yarn从hadoop 2引入,最初是为了改善MapReduce的实现,但是它具有通用性,同样执行其他分布式计算模式。
民工哥
2023/08/22
1.3K0
进击大数据系列(五):Hadoop 统一资源管理和调度平台 YARN
Hadoop高可用(HA)集群搭建
HA:High Available,高可用 在Hadoop 2.0之前,在HDFS集群中NameNode存在单点故障 (SPOF:A Single Point of Failure) 对于只有一个NameNode的集群,如果NameNode机器出现故障(比如宕机或是软件、硬件升级),那么整个集群将无法使用,直到NameNode重新启动
CoderJed
2018/09/13
4.4K0
Hadoop高可用(HA)集群搭建
推荐阅读
相关推荐
五万字 | 耗时一个月,整理出这份Hadoop吐血宝典
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验