Sqlserver如何遞歸查詢層級數據將父級字段和本級某個字段合併?如何自定義用戶函數並調用?

     開門見山,首先說下遇到的問題:前期系統地區字典表中,每一個省市縣只存了本級名稱,沒存完整的字段。如:肥西縣隸屬安徽省合肥市,表中就存了一個肥西縣。現有需求須要將完整字段顯示,因爲系統已在線上運營,沒法作過多複雜修改,初步定的方案是在表中新追加一個字段,將字段補齊,一是方便修改,二是爲了後期若是別的功能用到能夠拿新字段使用,簡化工做。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) 

       看下最終結果:

結束,收工!但願對你有幫助!

相關文章
相關標籤/搜索