복붙노트

[SQL] 어떻게 SQL 서버 XML 열에서 값을 조회 할 수 있습니다

SQL

어떻게 SQL 서버 XML 열에서 값을 조회 할 수 있습니다

나는 SQL Server 데이터베이스에서 XML 컬럼 (라는 역할)에 저장된 XML을 다음했다.

<root>
   <role>Alpha</role>
   <role>Beta</role>
   <role>Gamma</role>
</root>

나는 그들에 특정 역할이 모든 행을 표시하고 싶습니다. 이 역할은 매개 변수로 통과시켰다.

해결법

  1. ==============================

    1.

    select
      Roles
    from
      MyTable
    where
      Roles.value('(/root/role)[1]', 'varchar(max)') like 'StringToSearchFor'
    

    이 페이지는 더 어떻게 T-SQL 쿼리 XML 약을 보여줍니다 :

    T-SQL을 사용하여 XML 필드를 쿼리

    SQL 서버에서 XML 데이터를 편평

    편집하다

    조금 더 그와 함께 연주 후, 나는 사용이 적용 크로스 있다는이 놀라운 쿼리와 함께 끝났다. 이 사람은 당신이 당신과 같은 표현에 넣어 값에 대한 모든 행 (역할을)를 검색합니다 ...

    이 테이블 구조를 감안할 때 :

    create table MyTable (Roles XML)
    
    insert into MyTable values
    ('<root>
       <role>Alpha</role>
       <role>Gamma</role>
       <role>Beta</role>
    </root>')
    

    우리는이처럼 조회 할 수 있습니다 :

    select * from 
    
    (select 
           pref.value('(text())[1]', 'varchar(32)') as RoleName
    from 
           MyTable CROSS APPLY
    
           Roles.nodes('/root/role') AS Roles(pref)
    )  as Result
    
    where RoleName like '%ga%'
    

    당신은 여기에 SQL 바이올린을 확인할 수 있습니다 http://sqlfiddle.com/#!3/ae0d5/13

  2. ==============================

    2.

    declare @T table(Roles xml)
    
    insert into @T values
    ('<root>
       <role>Alpha</role>
       <role>Beta</role>
       <role>Gamma</role>
    </root>')
    
    declare @Role varchar(10)
    
    set @Role = 'Beta'
    
    select Roles
    from @T
    where Roles.exist('/root/role/text()[. = sql:variable("@Role")]') = 1
    

    어디 COL 사용할 수있는 '% 베타 %'포함 등의 작업에 대한 쿼리를 원하는 경우

    declare @T table(Roles xml)
    
    insert into @T values
    ('<root>
       <role>Alpha</role>
       <role>Beta</role>
       <role>Gamma</role>
    </root>')
    
    declare @Role varchar(10)
    
    set @Role = 'et'
    
    select Roles
    from @T
    where Roles.exist('/root/role/text()[contains(., sql:variable("@Role"))]') = 1
    
  3. ==============================

    3.당신의 필드 이름이 역할하고있는 경우 테이블 이름은 검색 할를 사용할 수 있습니다 표입니다

    당신의 필드 이름이 역할하고있는 경우 테이블 이름은 검색 할를 사용할 수 있습니다 표입니다

    DECLARE @Role varchar(50);
    SELECT * FROM table1
    WHERE Roles.exist ('/root/role = sql:variable("@Role")') = 1
    
  4. ==============================

    4.나도 기억하기 쉬운 주변에있는 아래 간단한 작업을 함께했다 :-)

    나도 기억하기 쉬운 주변에있는 아래 간단한 작업을 함께했다 :-)

    select * from  
    (select cast (xmlCol as varchar(max)) texty
     from myTable (NOLOCK) 
    ) a 
    where texty like '%MySearchText%'
    
  5. ==============================

    5.다음을 수행 할 수

    다음을 수행 할 수

    declare @role varchar(100) = 'Alpha'
    select * from xmltable where convert(varchar(max),xmlfield) like '%<role>'+@role+'</role>%'
    

    분명히 이것은 해킹의 비트는 내가 어떤 공식적인 솔루션을 추천하지 않을 것입니다. SQL 서버 2012은 SQL Server Management Studio에서 XML 컬럼에 애드혹 쿼리를 수행 할 때 그러나 나는이 기술은 매우 유용을 찾을 수 있습니다.

  6. ==============================

    6.나는 SQL 테이블에서 XML의 값을 검색하는 문 아래를 사용

    나는 SQL 테이블에서 XML의 값을 검색하는 문 아래를 사용

    with xmlnamespaces(default 'http://test.com/2008/06/23/HL.OnlineContract.ValueObjects')
    select * from (
    select
                OnlineContractID,
                DistributorID,
                SponsorID,
        [RequestXML].value(N'/OnlineContractDS[1]/Properties[1]/Name[1]', 'nvarchar(30)') as [Name]
       ,[RequestXML].value(N'/OnlineContractDS[1]/Properties[1]/Value[1]', 'nvarchar(30)') as [Value]
         ,[RequestXML].value(N'/OnlineContractDS[1]/Locale[1]', 'nvarchar(30)') as [Locale]
    from [OnlineContract]) as olc
    where olc.Name like '%EMAIL%' and olc.Value like '%EMAIL%' and olc.Locale='UK EN'
    
  7. ==============================

    7.유용한 팁. SQL 서버 XML 열에서 값을 쿼리 (네임 스페이스와 XML)

    유용한 팁. SQL 서버 XML 열에서 값을 쿼리 (네임 스페이스와 XML)

    EG

    Table [dbo].[Log_XML] contains columns Parametrs (xml),TimeEdit (datetime)
    

    EG CML YN Parametrs :

    <ns0:Record xmlns:ns0="http://Integration"> 
    <MATERIAL>10</MATERIAL> 
    <BATCH>A1</BATCH> 
    </ns0:Record>
    

    예를 들어, 검색어 :

    select
     Parametrs,TimeEdit
    from
     [dbo].[Log_XML]
    where
     Parametrs.value('(//*:Record/BATCH)[1]', 'varchar(max)') like '%A1%'
     ORDER BY TimeEdit DESC
    
  8. from https://stackoverflow.com/questions/10344553/how-can-i-query-a-value-in-sql-server-xml-column by cc-by-sa and MIT license