|
我已经在Google这个查询是在帮助下编写的,以便从表格中创建定界列表,但我对此查询一无所知。
5 X O. p! h) O4 H: u谁能解释我发生了什么?; o+ k; B+ p: \' {# {
SELECT E1.deptno, allemp = Replace ((SELECT E2.ename AS 'data() FROM emp AS e 2 WHERE e1.deptno = e2.DEPTNO FOR xml PATH,,FROM EMP AS e1 GROUP BY DEPTNO;给我结果% R/ t, `/ P9 U. @; q9 P
10 CLARK,KING,MILLER20 SMITH,JONES,SCOTT,ADAMS,FORD30 ALLEN,WARD,MARTIN,BLAKE,TURNER,JAMES ; `9 O, I5 ?: ^# e t
解决方案:
/ M) G1 ]! Y2 B: {( v- }- P 最简单的解释方法是检查它FOR XML PATH实际XML的工作方式。想象一个简单的表Employee:
3 s9 j; O# W& V* k$ D: AEmployeeID Name John Smith2 Jane Doe你可以用8 y2 J, q: N# r6 w h
SELECT EmployeeID,NameFROM emp.EmployeeFOR XML PATH ('Employee')这将创建XML,如下所示) s9 P! I8 w$ D9 ~
1 John Smith 2 Jane Doe从中PATH删除’Employee’会删除外部xml所以查询:
8 c# P5 H; J7 f0 E+ l' Z' USELECT NameFROM EmployeeFOR XML PATH ('')将创建
, a$ ~" y% [! t3 L5 W John Smith Jane Doe然后,您执行的操作并不理想,列出 data()会导致sql错误,因为它试图创建非法标签xml因此,标签会产生以下错误:
$ o% w3 ^5 j# J! r& D6 Z9 z5 r列名“ Data()”包含FOR XML要求的无效XML标识符;’(’(0x0028)是第一个第一个字符。
7 ^7 g2 J, V! b) e& ]: S相关子查询隐藏了这个错误,只生成没有标签的错误XML:
+ D b' V# `5 Z5 T% B3 kSELECT Name AS [Data()]FROM EmployeeFOR XML PATH ('')创造" @* l6 y A. O, C; ~# K
John Smith Jane Doe然后,用逗号代替空间很容易解释…
9 C# R2 y2 h) b2 _. L6 P- n F+ _如果我是你,我会稍微修改一下查询:' U) B, k6 r N& Z* O1 l" B. N' f
SELECT E1.deptno, STUFF(( SELECT , E2.ename FROM emp AS e2 WHERE e1.deptno = e2.DEPTNO FOR XML PATH一、二、二、二FROM EMP AS e1 GROUP BY DEPTNO;不列别名意味着不会创建xml标记,在select在查询中添加逗号意味着任何带有空格的名称都不会造成错误,STUFF删除第一个逗号和空格。
, T$ Y' y/ W1 |8 V附录# A: E3 u$ t# i8 o- ?3 P8 W
详细说明KM评论中提到的内容似乎越来越多,转义XML正确字符的正确方法是使用字符.value以下方法:
3 W; H$ h" V+ l3 jSELECT E1.deptno, STUFF(( SELECT , E2.ename FROM emp AS e2 WHERE e1.deptno = e2.DEPTNO FOR XML PATH(''),TYPE ).value('.','NVARCHAR(MAX)'),1,2,'') FROM EMP AS e1 GROUP BY DEPTNO; |
|