2017-03-25 4 views
-2

SQL Server 2012가 설치되어 있습니다. 테이블에 여러 레코드가있는 channel_group이라는 테이블이 있습니다. 나는 데이터베이스의 모든 레코드에 대한 각 채널의 태그의 ID 태그의 모든 값을 얻을 필요가 CHANNEL_GROUP 열에서 각 레코드에서SQL Server에서 열 xml을 구문 분석하는 방법

[dbo].[CHANNEL_GROUP] 
(
    [ID] [nvarchar](255) NOT NULL, 
    [NAME] [nvarchar](255) NOT NULL, 
    [REVISION] [int] NULL, 
    [CHANNEL_GROUP] [nvarchar](max) NULL 
) 

.

내가 실행할 수있는이 쿼리 나 동적 쿼리를 구문 분석하는 가장 좋은 방법은 무엇입니까?

<channelGroup version="3.4.2"> 
     <id>990b417d-27ae-4928-b4cc-cc010665615e</id> 
     <name>Production</name> 
     <revision>3</revision> 
     <lastModified> 
      <time>1490385251147</time> 
      <timezone>America/New_York</timezone> 
     </lastModified> 
     <description></description> 
     <channels> 
      <channel version="3.4.2"> 
       <id>321439ff-46d6-4c3d-b1cd-ebc48d3c7fd2</id> 
       <enabled>false</enabled> 
       <revision>0</revision> 
      </channel> 
      <channel version="3.4.2"> 
       <id>c2d06aee-3031-4c6a-a3c1-23f7e96c971c</id> 
       <enabled>false</enabled> 
       <revision>0</revision> 
      </channel> 
     </channels> 
</channelGroup> 
+1

를 사용하여 XML 방법 https://docs.microsoft.com/en-us/sql/t-sql/xml/xml-data-type- methods – Serg

+1

'CHANNEL_GROUP' 컬럼에 XML 데이터가 포함되어 있으면 nvarchar ... 대신 XML 형식을 사용해야합니다. – har07

답변

0
Declare @YourTable table (ID int,CHANNEL_GROUP varchar(max)) 
Insert Into @YourTable values 
(1,'<channelGroup version="3.4.2"><id>990b417d-27ae-4928-b4cc-cc010665615e</id><name>Production</name><revision>3</revision><lastModified><time>1490385251147</time><timezone>America/New_York</timezone></lastModified><description></description><channels><channel version="3.4.2"><id>321439ff-46d6-4c3d-b1cd-ebc48d3c7fd2</id><enabled>false</enabled><revision>0</revision></channel><channel version="3.4.2"><id>c2d06aee-3031-4c6a-a3c1-23f7e96c971c</id><enabled>false</enabled><revision>0</revision></channel></channels></channelGroup>'), 
(2,'<channelGroup version="3.9.9"><id>990b417d-27ae-4928-b4cc-cc010665615e</id><name>Production</name><revision>3</revision><lastModified><time>1490385251147</time><timezone>America/New_York</timezone></lastModified><description></description><channels><channel version="3.4.2"><id>SomeOtherID</id><enabled>false</enabled><revision>0</revision></channel><channel version="3.4.2"><id>AnotherID</id><enabled>false</enabled><revision>0</revision></channel></channels></channelGroup>') 

Select A.ID 
     ,Channel_ID= C.ID 
From @YourTable A 
Cross Apply (Select XMLData=cast(A.CHANNEL_GROUP as xml)) B 
Cross Apply (
       Select [id]  = f.n.value('(id)[1]','varchar(50)') 
       From B.XMLData.nodes('channelGroup/channels') t(n) 
       Cross Apply t.n.nodes('channel') f(n) 
      ) C 

반환

ID Channel_ID 
1 321439ff-46d6-4c3d-b1cd-ebc48d3c7fd2 
1 c2d06aee-3031-4c6a-a3c1-23f7e96c971c 
2 SomeOtherID 
2 AnotherID 
+0

테이블에 여러 행이 있습니다. 쿼리 나 다른 방법을 통해 행을 가져와야합니다. 이것은 테이블 중 하나의 값을 하드 코딩하는 것으로 나타납니다. 기본적으로 나는 하나의 테이블을 쿼리 할 필요가 있다고 가정하고, 레코드의 최종리스트를 얻기 위해 각각 얼마나 많은 레코드가 있는지를 파싱한다. – Villumanati

+0

예를 들어 테이블에 1000 개의 행이 있으면 어떻게해야합니까? 나는 그들을 구문 분석하기 위해 위에있는 것처럼 하드 코딩하지 않을 것이다. 테이블에 얼마나 많은 행이 있는지 알지 못하지만 동적이어야합니다. 기본적으로 CHANNEL_GROUP 테이블에 4 열 (id, name, revision, channel_Group)이 있습니다. 전반적으로 필요한 것은 ChannelGroup 태그의 id 태그에있는 채널 ID를 얻는 것입니다.이 ID는 결과 열이 될 수 있습니다. channelgroupID를 호출하면 모든 channelgroupID에 채널 ID가 1 개 이상 있습니다. 채널 ID는 당신이 그 문제 – Villumanati

+0

ID를 해결 한 \t NAME 29f37017-65d9-4052-954e-c3ca9f07136b \t 데브 967a1deb-8b47-4eb0-865a-adf6998667bd \t 그룹 1 990b417d-27ae- 표시되는 XML 구조에서 올 것이다 4928-b4cc-cc010665615e \t 프로덕션 – Villumanati

관련 문제