Sqlserver如何递归查询层级数据将父级字段和本级某个字段合并?如何自定义用户函数并调用?
开门见山,首先说下遇到的问题:前期系统地区字典表中,每个省市县只存了本级名称,没存完整的字段。如:肥西县隶属安徽省合肥市,表中就存了一个肥西县。现有需求需要将完整字段显示,由于系统已在线上运营,无法做过多复杂修改,初步定的方案是在表中新追加一个字段,将字段补齐,一是方便修改,二是为了后期如果别的功能用到可以拿新字段使用,简化工作。
好了,问题已经明确,接下来就想想怎么解决问题了。也不是什么比较难得问题,刚好闲着无聊,就打开园子写下随笔,或许能帮到有相关问题的人。
围绕两个问题来说。
Sqlserver如何递归查询层级数据将父级字段和本级某个字段合并?
我们都知道oracle中递归是通过connect by prior 来实现的, 那sqlserver中如何实现呢?sqlserver中是没有此关键字辅助的。
地区表结构如下:

sqlserver递归代码贴上:
------查询树结构某节点的上级所有跟节点
with areadata (sID,sSuperID,sName)
as
(
---起始条件
select m.sID,m.sSuperID,m.sName
from [AdoptionRegister_Membership].[dbo].[mdb_Area] m where sID='340824' --列出子节点查询条件
--递归条件
union all
select a.sID,a.sSuperID,a.sName
from [AdoptionRegister_Membership].[dbo].[mdb_Area] a
inner join
areadata b on a.sID=b.sSuperID
--根据子节点父级字段查询父级信息
)
select * from areadata
查询结果如下:

接下来 我们现在要考虑如何将字段拼接合成,这里我们可以使用stuff来完成,代码如下:
select stuff((
select ''+sName
from areadata where sID!='000000' order by sID asc for xml path('')),1,0,'') as name ; -----sID!='000000' 这里是过滤全国这行数据
查询效果如下:

OK,以上已初步解决了如何递归查询层级数据将父级字段和本级某个字段合并问题!现在我们继续看待第二个问题。
如何自定义用户函数并调用?
其实就是创建一个自定义标量值自定义函数,将我们刚才写的递归查询封装起来,并返回合并后的值,这个地方就很简单了。代码如下:
USE [AdoptionRegister_Manage]
GO
/****** Object: UserDefinedFunction [dbo].[GET_Area_FullName] Script Date: 01/10/2018 15:50:55 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
Create FUNCTION [dbo].[GET_Area_FullName]
(
@sid nvarchar(40)
)
RETURNS nvarchar(40)
AS
BEGIN
DECLARE @str nvarchar(40)
set @str=N'未查到';
with areadata (sID,sSuperID,sName)
as
(
select m.sID,m.sSuperID,m.sName
from [AdoptionRegister_Membership].[dbo].[mdb_Area] m where sID=@sid
union all
select a.sID,a.sSuperID,a.sName
from [AdoptionRegister_Membership].[dbo].[mdb_Area] a
inner join
areadata b on a.sID=b.sSuperID
)
select @str=stuff((
select ''+sName
from areadata where sID!='000000' order by sID asc for xml path('')),1,0,'')
RETURN @str
END
------------------------------
测试调用
select dbo.GET_Area_FullName('340824')

-----------
至此我们已经解决了抛出的问题,最后运用函数将表中新加字段全局更新就OK了!
update [AdoptionRegister_Membership].[dbo].[mdb_Area] set sFullName=dbo.GET_Area_FullName(sID)
看下最终结果:

结束,收工!希望对你有帮助!
Sqlserver如何递归查询层级数据将父级字段和本级某个字段合并?如何自定义用户函数并调用?的更多相关文章
- js 递归树结构数据查找父级
1.json树数据查找所有父级--完成 json:树结构数据 var arrData = [{ "label": "中国", "City": ...
- el-cascader组件根据最后一级向上找到父级并设置默认值
vue + elementUI项目中,el-cascader级联选择器使用频率非常高,一些基本使用方法可以参考elementUI官方文档,本文主要研究当接口只返回最后一级id时,如何向上找出所有父级数 ...
- SQLServer比较两条数据是否相同
SQLServer比较两条数据是否相同 直接比较可能会一个一个字段的比较,也可以将多个字段拼成一个串然后比较,这里有个hash值比较的方法,很好用 用法 将需要的比较的column放进去,逗号隔开,只 ...
- phpcms v9如何给父级单页栏目添加内容
对于phpcms单页的调用相信大家都应该没问题,那么如果我们在后台添加的单页有二层甚至更多的时候,这样在管理内容上是没有给父级栏目添加内容这一功能的!那么我们该怎么实现这个功能并调用呢? 首先我们要修 ...
- 使用Oracle数据库实现树形结构表的子-父级递归查询和删除,通过级联菜单简单举例
前言: 我们在开发中,常常遇到单表的子-父id级联的表结构,在树形的深度不确定的情况下,一次查询出某个树形结构下的所有具有子-父级关系的数据变得十分困难. 这时,我们使用oracle提供的CONNEC ...
- 关于chart.js 设置canvas的宽度为父级元素的宽度的百分百 以及 X轴上面刻度数据太多如何处理
今天在做一个数据统计的界面的时候,需要做折线统计图,在网上找了一圈发现数据统计的插件还是不少的,本着轻量级的的原则选择了Chart.js,后来在做的过程中便遇到两个问题,以此记录下来,和刚刚接触前端的 ...
- JsRender实用教程(tag else使用、循环嵌套访问父级数据)
前言 JsRender是一款基于jQuery的JavaScript模版引擎,它具有如下特点: · 简单直观 · 功能强大 · 可扩展的 · 快如闪电 这些特性看起来很厉害,但几乎每个模版引擎, ...
- JS:字符串转成json数据,和json转成字符串方法 iframe获取父级传过来的数据
字符串转成json数据,和json转成字符串方法 //转为JSON adinfo=JSON.parse(adinfo) //转为字符串 adinfo=JSON.stringify(adinfo) 大概 ...
- 页面单击按钮弹出modaldialog然后调用ajax处理程序获取数据,给父级页面控件赋值
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="RefTopicList.asp ...
随机推荐
- 框架原理第一讲,熟悉常用的设计方式.(以MFC框架讲解)
框架原理第一讲,熟悉常用的设计方式.(以MFC框架讲解) 一丶什么是框架,以及框架的作用 什么是框架? 框架,简而言之就是把东西封装好了,使用框架开发可以快速开发程序,例如MFC程序的双击写代码. 为 ...
- 阿里云服务器部署php的laravel项目,在阿里云买ECS 搭建 Linux+Nginx+Mysql+PHP环境的
在阿里云买ECS的时候选择自己习惯的镜像系统,我一般都是使用Linux Ubuntu,所以,以下的配置都是在Ubuntu 14.04稳定支持版的环境中搭建Linux+Nginx+Mysql+PHP环境 ...
- ansible批量管理软件部署及剧本
服务器版本信息: Centos6.9 [root@db02 ~]# uname -a Linux db02 -.el6.x86_64 # SMP Tue Mar :: UTC x86_64 x86_6 ...
- JaveScript简单数据类型(JS知识点归纳二)
JS中的简单数据类型有五种 : --> string --> number -->boolean --> null -->undefined 数据类型的检测 :typeo ...
- 5个步骤,将 storyboard 从 iphone 版转变为 ipad 版
1.将 iPhone 版的 Storyboard 复制为 iPad 的,比如 Main_iPad.storyboard 2.用文本编辑器(不要用 Xcode)打开 Main_iPad.storyboa ...
- java萌新尝试搭建WordPress记录
问题1:安装好PHP环境没找好mysql路径,导致不能调用数据库模块 解决方案:重装一次,参考链接 https://www.cnblogs.com/yangxia-test/p/4174372.htm ...
- intellij IDEA里各图标对应的文件类型
本篇内容为大家提供的是IntelliJ IDEA 使用教程中的常见文件类型的图标介绍,IntelliJ IDEA是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一, ...
- springboot+shiro
作者:纯洁的微笑 出处:http://www.ityouknow.com/ 这篇文章我们来学习如何使用Spring Boot集成Apache Shiro.安全应该是互联网公司的一道生命线,几乎任何的公 ...
- .Net Core在X86上实现Interlocked.Increment(ref long)的方式
因为在X86上long会被分割为两个int进行操作, 那么Interlocked.Increment的实现成为了一个问题. 在一番搜索后未发现有现成的文章解释这个问题,于是我就动手分析了. 这篇是笔记 ...
- 微信小程序教学第三章第三节(含视频):小程序中级实战教程:视图与数据关联
§ 视图与数据关联 本文配套视频地址: https://v.qq.com/x/page/z0554wyswib.html 开始前请把 ch3-3 分支中的 code/ 目录导入微信开发工具 首先 首先 ...