FOR XML의 RAW 모드에 대한 코드 예제에 대한 자세한 설명

黄舟
풀어 주다: 2017-03-22 17:03:13
원래의
2203명이 탐색했습니다.

설명:

원시 모드는 쿼리 결과 집합의 각 행을 요소 이름을 가진 xml 요소로 변환하고, 각 행의 열을 행 속성으로 변환합니다.

중첩된 FOR XML 쿼리를 작성하여 XML 계층 구조를 생성할 수 있습니다.

기본적으로 null이 아닌 모든 값은 요소의 속성으로 매핑됩니다.

쿼리 결과 집합의 데이터를 요소의 하위 요소로 변환해야 하는 경우

구문:

FOR XML
RAW [ ('ElementName') ] 
    [ 
       <CommonDirectives> 
       [ , { XMLDATA | XMLSCHEMA [ (&#39;TargetNameSpaceURI&#39;) ]} ] 
       [ , ELEMENTS [ XSINIL | ABSENT ] 
    ] <CommonDirectives> ::= 
   [ , BINARY BASE64 ]
   [ , TYPE ]
   [ , ROOT [ (&#39;RootName&#39;) ] ]
로그인 후 복사
<🎜를 사용해야 합니다. >자세한 내용은 예를 참조하세요.

테이블 베이스를 생성합니다. 테이블 구조는 다음과 같습니다.

列名数据类型允许空
idint允许
bodynvarchar(50)允许
다음과 같이 테이블 데이터를 삽입합니다.

idbody
1aaaa
2bbbb
3cccc
4
예문:

A. 쿼리 데이터의 정보를 반환하고 for xml 원시 모드

/*
结果:
    <row id="1" body="aaaa" />
    <row id="2" body="bbbb" />
    <row id="3" body="dddd" />
    <row id="4" />
*/select * from base for xml raw;
로그인 후 복사

를 사용하여 결과 세트는 ELEMENTS 지시문을 지정하여 하위 요소 형태로 나타납니다.

/*
结果:
    <row>
      <id>1</id>
      <body>aaaa</body>
    </row>
    <row>
      <id>2</id>
      <body>bbbb</body>
    </row>
    <row>
      <id>3</id>
      <body>dddd</body>
    </row>
    <row>
      <id>4</id>
    </row>
*/select * from base for xml raw,elements;
로그인 후 복사

이 예제 문장에서는 ID가 4인 본문이 표시되지 않는 것을 확인했습니다.

그 이유는 elements 명령어를 사용할 때, 다음 명령어를 지정하지 않으면 기본적으로 abscent가 사용되기 때문인데, 현재는 null 값에 대해 어떤 요소도 생성되지 않기 때문이다.

다음 예제 문장에서는 xsinil 요소를 사용하여 xml에 null 값을 표시할 수 있습니다.

B. 요소 지시문과 xsinil 지시문을 모두 지정하여 null을 생성합니다. 열 값 요소

/*
结果:
    <row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <id>1</id>
      <body>aaaa</body>
    </row>
    <row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <id>2</id>
      <body>bbbb</body>
    </row>
    <row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <id>3</id>
      <body>dddd</body>
    </row>
    <row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <id>4</id>
      <body xsi:nil="true" />
    </row>
*/select * from base for xml raw,elements xsinil;
로그인 후 복사

은 각 데이터를 요소로 표시하므로 요소 이름을 다른 이름으로 수정하는 방법은 무엇입니까? ; 요소

/*
结果:
    <baseinfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <id>1</id>
      <body>aaaa</body>
    </baseinfo>
    <baseinfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <id>2</id>
      <body>bbbb</body>
    </baseinfo>
    <baseinfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <id>3</id>
      <body>dddd</body>
    </baseinfo>
    <baseinfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <id>4</id>
      <body xsi:nil="true" />
    </baseinfo>
*/select * from base for xml raw(&#39;baseinfo&#39;),elements xsinil;
로그인 후 복사

우리 모두는 모든 xml 파일에 루트 요소가 있다는 것을 알고 있습니다. 이 xml 텍스트와 해당 루트 요소의 이름을 어떻게 바꾸나요? xml용으로 생성된 xml의 경우 루트 요소
를 사용하여 루트 지시문의 기본 루트 요소는

/*
结果:
    <base xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <baseinfo>
        <id>1</id>
        <body>aaaa</body>
      </baseinfo>
      <baseinfo>
        <id>2</id>
        <body>bbbb</body>
      </baseinfo>
      <baseinfo>
        <id>3</id>
        <body>dddd</body>
      </baseinfo>
      <baseinfo>
        <id>4</id>
        <body xsi:nil="true" />
      </baseinfo>
    </base>
*/select * from base for xml raw(&#39;baseinfo&#39;),root(&#39;base&#39;),elements xsinil;
로그인 후 복사

입니다. 현재 생성된 xml 결과는 매우 좋아 보이지만, 데이터베이스의 body 열을 xml의 요소로 변경하려면 어떻게 수정해야 할까요? 요소 이름

/*
结果:
    <base xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <baseinfo>
        <id>1</id>
        <data>aaaa</data>
      </baseinfo>
      <baseinfo>
        <id>2</id>
        <data>bbbb</data>
      </baseinfo>
      <baseinfo>
        <id>3</id>
        <data>dddd</data>
      </baseinfo>
      <baseinfo>
        <id>4</id>
        <data xsi:nil="true" />
      </baseinfo>
    </base>
*/select id,body data from base for xml raw(&#39;baseinfo&#39;),root(&#39;base&#39;),elements xsinil;
로그인 후 복사

현재 결과는 기본적으로 xml의 기본 형식을 따릅니다. 그런 다음 id 및 body 열에 이름이 지정되지 않으면 루트 요소 이름도 없다고 가정합니다. 요소명을 지정하지 않으면 어떤 단점이 생기나요?

/*
结果:
    1aaaa2bbbb3dddd4
*/
--因为id为int类型,为使id不出现列名,我们使id+0
--因为body为nvarchar类型,为使body不出现列名,我们使body+&#39;&#39;select id+0,body+&#39;&#39; from base for xml raw(&#39;&#39;), elements;
로그인 후 복사

그런데 위 결과에서는 데이터 각각을 구별할 수 없는 것 같고, id가 4로 null 값이 표시되지 않고, 수정하는 방법은 다음 문장을 참고하세요.

/*
结果:
    1,aaaa;2,bbbb;3,dddd;4,null;
*/select id+0,&#39;,&#39;,isnull(body,&#39;null&#39;)+&#39;&#39;,&#39;;&#39; from base for xml raw(&#39;&#39;),elements;
로그인 후 복사

이제부터 컬럼 이름이 없다는 장점을 본 것 같습니다. 사실 이전 문장은 좀 더 수정이 가능합니다.

/*
结果:
    1,aaaa;2,bbbb;3,dddd;4,null;
*/select convert(nvarchar,id)+&#39;,&#39;+isnull(body,&#39;null&#39;)+&#39;;&#39; from base for xml raw(&#39;&#39;),elements;
로그인 후 복사

결과가 다른 방식으로 나타나도록 다시 수정해 보겠습니다.

/*
结果:
    {1,aaaa}{2,bbbb}{3,dddd}{4,null}
*/select &#39;{&#39;+convert(nvarchar,id)+&#39;,&#39;+isnull(body,&#39;null&#39;)+&#39;}&#39; from base for xml raw(&#39;&#39;),elements;
로그인 후 복사

이제 Combine이 가능하다는 것을 알 수 있습니다. 필요에 따라 필요한 결과를 생성해야 합니다.
SQLServer2005에서는 xml 데이터 유형이 지원되므로 TYPE 명령을 작성하여 xml 데이터에 FOR XML 쿼리 결과를 반환할 수 있습니다. type.type의 예는 다음과 같습니다.

declare @string nvarchar(1000)declare @xml xml/*
    消息257,级别16,状态3,第8行
    不允许从数据类型xml到nvarchar的隐式转换。请使用CONVERT函数来运行此查询。
*/
--set @string=(select id,body from base for xml raw,type)set @xml=(select id,body from base for xml raw,type)
로그인 후 복사

마지막으로 일반적인 예를 사용하여 xml raw 모드에 대한 응용 프로그램을 소개합니다.

학생 테이블 만들기 , 테이블 구조는 다음과 같습니다.

다음과 같이 테이블 데이터를 삽입합니다.

建课程表sclass,表结构如下:

列名数据类型允许空
cidint允许
namenvarchar(50)允许

插入表数据如下:

idname
1语文
2数学
3英语

建student_class表,表结构如下:

列名数据类型允许空
sidint
cidint

插入数据如下:

cidsid
11
12
13
21
32
33

至此,数据结果是:

姓名课程
张三语文
张三数学
张三英语
李四语文
王五数学
王五英语

我们需要最后的结果形式如下:

姓名课程
张三语文,数学,英语
李四语文
王五数学,英语

该如何实现呢?

/*
结果:
    张三    语文,数学,英语
    李四    语文
    王五    数学,英语
*/select [name],            
stuff(
(                    
select &#39;,&#39;+[name]                    
from sclass                    
where cid in (                                    
select cid                                    
from student_class                                    
where student.sid=student_class.sid                                
)                    
for xml raw(&#39;&#39;),elements                
),            
1,1,&#39;&#39;) sclassfrom student
로그인 후 복사

위 내용은 FOR XML의 RAW 모드에 대한 코드 예제에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!