开门见山,首先说下遇到的问题:前期系统地区字典表中,每一个省市县只存了本级名称,没存完整的字段。如:肥西县隶属安徽省合肥市,表中就存了一个肥西县。现有需求须要将完整字段显示,因为系统已在线上运营,没法作过多复杂修改,初步定的方案是在表中新追加一个字段,将字段补齐,一是方便修改,二是为了后期若是别的功能用到能够拿新字段使用,简化工做。sql
好了,问题已经明确,接下来就想一想怎么解决问题了。也不是什么比较可贵问题,恰好闲着无聊,就打开园子写下随笔,或许能帮到有相关问题的人。oracle
围绕两个问题来讲。 函数
Sqlserver如何递归查询层级数据将父级字段和本级某个字段合并?sqlserver
咱们都知道oracle中递归是经过connect by prior 来实现的, 那sqlserver中如何实现呢?sqlserver中是没有此关键字辅助的。测试
地区表结构以下:server
sqlserver递归代码贴上:xml
------查询树结构某节点的上级全部跟节点递归
with areadata (sID,sSuperID,sName)
as
(ip
---起始条件
select m.sID,m.sSuperID,m.sName
from [AdoptionRegister_Membership].[dbo].[mdb_Area] m where sID='340824' --列出子节点查询条件it
--递归条件
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)
看下最终结果:
结束,收工!但愿对你有帮助!