Sqlserver如何遞迴查詢層級資料將父級欄位和本級某個欄位合并?如何自訂使用者函數並調用?

來源:互聯網
上載者:User

標籤:har   bubuko   名稱   nbsp   png   def   接下來   members   turn   

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

 好了,問題已經明確,接下來就想想怎麼解決問題了。也不是什麼比較難得問題,剛好閑著無聊,就開啟園子寫下隨筆,或許能幫到有相關問題的人。

 圍繞兩個問題來說。  

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 [email protected]
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如何遞迴查詢層級資料將父級欄位和本級某個欄位合并?如何自訂使用者函數並調用?

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.