在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 |
|
|
|
|
|