回答

收藏

在SQL Server中使用FOR XML PATH查询以获取XML输出以获取分层数据

技术问答 技术问答 198 人阅读 | 0 人回复 | 2023-09-14

我有一个表,该表的列为NodeId,NodeName,ParentNodeId,并且我想以Xml的形式输出整个表数据,如下所示,使用SQL查询。我认为可以使用递归来在Sql7 m% L5 ?" H2 p0 K
Server中使用FOR XML PATH模式来实现此目的(我使用SQL Server 2008),但不确定如何做到这一点。提前致谢
4 O- `0 ~% O0 v" x
& ~& F, g; G3 B1 n% v9 m( X  + |9 A; Y) g1 ^# w
    2 L: m, c5 \' S" q0 w
      3 P5 E2 _2 x4 |$ @
      ' _# c1 }* j& U! W& Y+ T8 a
   
. t+ I7 ~# V& t' l1 {) P  
/ y9 _0 a: }0 Y" F  , e* |) x5 b. f" ^" \/ o) p$ R7 \
   
% ~- E" v9 U: p- J: n$ K      4 y/ \$ H' D. z( v; w
      
3 ^; h' o$ U, D, V* s    & _) F+ K* T: i, p& O) H
  0 V6 S' U- ~; j8 P0 P! s9 _

/ q# E2 E7 g5 n# U                7 ~& _4 b$ u6 B# y- l
解决方案:7 H0 E, b* S9 Z
                + Q5 l, \- i" d# O' }: O
' i1 w9 X. R. g, o' l

) ?1 ^/ ~1 G) D; v5 A& X( @0 \7 m                我使用存储过程和递归函数解决了它。如下所示的代码。(实际上,我希望它生成一个菜单xml,因此将显示该菜单的代码。
! G  a+ }# ?6 H8 V# c- `    CREATE PROCEDURE [dbo].[usp_GetMenu]) Z2 H5 ]& }4 g' ]" K& g( N
    AS
; t+ b' c- a' R) [    BEGIN8 t/ Z+ k2 h) Y/ Y
        SET NOCOUNT ON;, r% P- L) z! Y
        SELECT  dbo.fnGetMenuItems(MenuId)2 E6 H& v) Q7 d" x1 M9 `' R% I
        FROM    dbo.Menu. C/ i- j+ v. [0 l  W2 k1 _
        WHERE   ParentMenuId IS NULL
) }0 v0 g" e; `, w( j# M        FOR XML PATH('MenuItems')- @: r. \& ]- N  q$ p
    END
/ \7 T, G+ I  p    GO+ i: L' Z9 ?/ J' k( G& A
CREATE FUNCTION [dbo].[fnGetMenuItems]# y! E0 h. t. i+ l8 r( D
(4 }+ S* u& ^/ t) w6 |8 [4 N  r
    @MenuId int  I7 O) A2 i- n% J; p2 L( I, f
). ~3 i# C4 {8 r  ^" M% V. @/ B
RETURNS XML
5 v6 P9 L% v' aWITH RETURNS NULL ON NULL INPUT
8 E. j  O+ S8 q, D( VAS6 S$ y* Q' R, _: ~' u/ c6 `7 k8 p
BEGIN
/ w' U1 L& {6 J/ j9 i  H8 x  C, S    RETURN 4 t- f* Y& f' D! _6 E
    (
& f$ H: g; v+ n" G        SELECT  MenuId AS "@Id"
1 M2 ?8 T6 [1 [- L5 q                , [Name] AS "@Name"
4 e2 G$ i- s- S8 E4 h                , [URL] AS "@URL"; \% L. I8 ?1 C) S. C
                , [Key] AS "@Key"/ s) s9 X# p" E% `
                , [dbo].[fnGetMenuItems](MenuId)
$ a3 o1 O$ E" d1 S9 f        FROM    dbo.Menu
+ x4 V- B1 n; ?0 M$ y0 b3 s% f        WHERE   ParentMenuId = @MenuId& [  A4 x  c. `+ ~
        FOR XML PATH('MenuItem'),TYPE
3 o. p2 j7 r2 v# t2 W9 W    )9 e9 S# ~9 q+ Q$ F
END" W9 [8 X7 n5 ^8 B# c
GO
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则