2014-01-17 3 views
-1

MS SQL Server 2012 데이터베이스 테이블 의 데이터 형식 열에서 다음과 같이 결과를 얻으려고 SQL 쿼리를 작성하려고합니다. 데이터는 데이터베이스에 다음과 같이 저장됩니다.SQL 테이블에서 xml 데이터를 선택하는 방법

ID | Col1  | Col2 
========================== 
1  | S1  | N 
2  | S2  | Y 

당신이 날이를 정렬하는 데 도움을 주시겠습니까 다음과 같이

ID |Summary 
========================== 
1 |<Summary><Field Key="Col1" Value="S1" /><Field Key="Col2" Value="N" /></Summary> 
2 |<Summary><Field Key="Col1" Value="S2" /><Field Key="Col2" Value="Y" /></Summary> 

나는 기록의 결과 집합을해야합니까?

+2

안녕하세요. 도움말 섹션 (http://stackoverflow.com/help/how-to-ask)을 읽어보십시오. 불행히도 이것은 매우 낮은 품질의 질문입니다. 의미있는 세부 사항 (데이터베이스 플랫폼 등)을 제공하지는 않습니다. 귀하의 질문은 XML에 대해 묻지 만 XML 데이터는 표시하지 않습니다. 도움말 섹션을 읽고 질문을 업데이트하십시오. – OldProgrammer

+0

XML 데이터 추출은 플랫폼에 따라 다릅니다. 우리는 독자들을 염두에 두지 않으므로 우리에게 말하면 도움이 될 것입니다. – OldProgrammer

답변

0

MSSQL의 XML을 사용하고 있으므로 XML 유형 .query() 함수에 익숙해야합니다. .query('.')의 결과를 사용

IF NOT EXISTS (SELECT 1 
       FROM sys.objects 
       WHERE name = 'XMLParty' 
        AND type = 'U') 
BEGIN 
    --DROP TABLE dbo.XMLParty; 
    CREATE TABLE dbo.XMLParty 
    (
     ID   INTEGER IDENTITY(1, 1) NOT NULL, 
         PRIMARY KEY (ID), 
     Summary  XML 
    ); 
END; 

INSERT INTO dbo.XMLParty (Summary) 
VALUES ('<Summary><Field Key="Surname" Value="S1" /><Field Key="Action" Value="N" /></Summary>'); 

INSERT INTO dbo.XMLParty (Summary) 
VALUES ('<Summary><Field Key="Surname" Value="S2" /><Field Key="Action" Value="Y" /></Summary>'); 
GO 

SELECT ID, 
     Surname = Summary.value('(./Summary/Field/@Value)[ 1 ]', 'VARCHAR(MAX)'), 
     Value = Summary.value('(./Summary/Field/@Value)[ 2 ]', 'VARCHAR(MAX)'), 
     Summary.query('.') 
FROM dbo.XMLParty; 

단순히 Summary 열을 선택으로, 모든면에서 절대적으로 동일하지만 구문은 당신에게 당신이 원하는 결과에 대한 .value() 기능을 사용하는 방법에 대한 통찰력을 줄 것입니다. xmlField.value('(./Root/Node/@Attribute)[ n ]', 'VARCHAR(MAX)')와) 위의 완료로 (.은 XML의 루트이며, 거기에서, 당신은 (xmlField.value('(./Root/Node)[ n ]', 'VARCHAR(MAX)')를 노드 값을 조회 또는 속성을 수 있습니다.

는 XML과 같은 <R><N><A v="1" /><A v="2" /></N><N><A v="3" /></N></R>를 사용하는 경우 같은 개는 다수가있다

, .value('(./R/N/A/@v)[ 3 ]', 'VARCHAR(MAX)')하지 않습니다 심지어 A 노드가 다른 N 노드 (레벨에만 신경을 써야 함)에 있다는 것을 원격으로 관리하지만, .query()을 사용하면 많은 정보를 얻을 수 있습니다.

0

XML에서 값을 추출하려면 value())을 사용합니다. 첫 번째 매개 변수는 값을 찾는 데 사용되는 XQuery 식이고 두 번째 매개 변수는 데이터 형식입니다.

이고 오른쪽에서 왼쪽으로 읽는다면 0

아래 사용 된 XQuery 표현식이 (/Summary/Field[@Key = "Col1"]/@Value)[1]

말한다 : 속성 Key이 요소 Field에서 Col1입니다 Field이 아이가 Summary에 어디
나에게 속성 Value에서 발견 된 첫 번째 값을 지정 Summary은 루트 요소입니다.

SQL Fiddle

MS SQL 서버 2008 스키마 설정 : 1

create table T 
(
    ID int, 
    Summary xml 
) 

insert into T values 
(1, '<Summary><Field Key="Col1" Value="S1" /><Field Key="Col2" Value="N" /></Summary>'), 
(2, '<Summary><Field Key="Col1" Value="S2" /><Field Key="Col2" Value="Y" /></Summary>') 

검색어 :

select T.ID, 
     T.Summary.value('(/Summary/Field[@Key = "Col1"]/@Value)[1]', 'varchar(10)') as Col1, 
     T.Summary.value('(/Summary/Field[@Key = "Col2"]/@Value)[1]', 'varchar(10)') as Col2 
from T 

Results :

| ID | COL1 | COL2 | 
|----|------|------| 
| 1 | S1 | N | 
| 2 | S2 | Y | 
관련 문제