>  기사  >  백엔드 개발  >  FOR XML의 RAW 모드에 대한 코드 예제에 대한 자세한 설명

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

黄舟
黄舟원래의
2017-03-22 17:03:132206검색

설명:

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

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

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

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

구문:

FOR XML
RAW [ ('ElementName') ] 
    [ 
       <CommonDirectives> 
       [ , { XMLDATA | XMLSCHEMA [ (&#39;TargetNameSpaceURI&#39;) ]} ] 
       [ , ELEMENTS [ XSINIL | ABSENT ] 
    ] <CommonDirectives> ::= 
   [ , BINARY BASE64 ]
   [ , TYPE ]
   [ , ROOT [ (&#39;RootName&#39;) ] ]
자세한 내용은 예를 참조하세요.

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

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

id body
1 aaaa
2 bbbb
3 cccc
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;

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

/*
结果:
    <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의 경우 루트 요소
를 사용하여 루트 지시문의 기본 루트 요소는 4216313e5055da45c6d0ded129c5d644

/*
结果:
    <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의 1d029f6197b5a3eb8a3fdf0a088ddf55 요소로 변경하려면 어떻게 수정해야 할까요? 요소 이름

/*
结果:
    <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,表结构如下:

列名 数据类型 允许空
cid int 允许
name nvarchar(50) 允许

插入表数据如下:

id name
1 语文
2 数学
3 英语

建student_class表,表结构如下:

列名 数据类型 允许空
sid int  
cid int  

插入数据如下:

cid sid
1 1
1 2
1 3
2 1
3 2
3 3

至此,数据结果是:

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

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

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

该如何实现呢?

/*
结果:
    张三    语文,数学,英语
    李四    语文
    王五    数学,英语
*/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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.