복붙노트

[SQL] 는 SQL 서버에서 어떻게 물건과 'XML 경로에 대한'작업

SQL

는 SQL 서버에서 어떻게 물건과 'XML 경로에 대한'작업

표는 다음과 같습니다

+----+------+
| Id | Name |
+----+------+    
| 1  | aaa  |
| 1  | bbb  |
| 1  | ccc  |
| 1  | ddd  |
| 1  | eee  |
+----+------+

필수 출력 :

+----+---------------------+
| Id |        abc          |
+----+---------------------+ 
|  1 | aaa,bbb,ccc,ddd,eee |
+----+---------------------+

질문:

SELECT ID, 
    abc = STUFF(
                 (SELECT ',' + name FROM temp1 FOR XML PATH ('')), 1, 1, ''
               ) 
FROM temp1 GROUP BY id

이 쿼리는 제대로 작동합니다. 하지만 난 그냥 작동 또는이 작업을 수행하는 다른 나 짧은 방법이 어떻게 설명을해야합니다.

나는 정말이를 이해하는 데 혼란을 얻고있다.

해결법

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

    1.여기 그것이 작동하는 방법이다 :

    여기 그것이 작동하는 방법이다 :

    FOR XML을 1. 가져 오기 XML 요소 문자열

    쿼리의 끝에 XML 경로 추가하면 PATH 인수에 포함 된 요소 이름, 출력 XML 요소로 쿼리의 결과로 수 있습니다. 우리가 있었던 예를 들어, 다음 문을 실행합니다 :

    SELECT ',' + name 
                  FROM temp1
                  FOR XML PATH ('')
    

    (( '') XML 경로) 빈 문자열을 전달함으로써, 우리는 대신 다음을 얻을 :

    ,aaa,bbb,ccc,ddd,eee
    

    물건 쉼표를 선도 2. 제거

    물건 문 첫 번째 문자열 내에서 문자를 대체하는 또 다른에 문자로 "물건"하나의 문자열. 우리는, 그러나, 단순히 값의 결과 목록의 첫 번째 문자를 제거하는 데 사용하고 있습니다.

    SELECT abc = STUFF((
                SELECT ',' + NAME
                FROM temp1
                FOR XML PATH('')
                ), 1, 1, '')
    FROM temp1
    

    (STUFF)의 매개 변수는 다음과 같습니다

    우리와 끝까지 그래서 :

    aaa,bbb,ccc,ddd,eee
    

    전체 목록을 가져 ID에 가입합니다

    우리가 임시 테이블에 ID의 목록이 가입 다음으로, 이름 ID 목록을 얻을 수 있습니다 :

    SELECT ID,  abc = STUFF(
                 (SELECT ',' + name 
                  FROM temp1 t1
                  WHERE t1.id = t2.id
                  FOR XML PATH (''))
                 , 1, 1, '') from temp1 t2
    group by id;
    

    그리고 우리는 우리의 결과를 가지고 :

    -----------------------------------
    | Id        | Name                |
    |---------------------------------|
    | 1         | aaa,bbb,ccc,ddd,eee |
    -----------------------------------
    

    도움이 되었기를 바랍니다!

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

    2.이 문서에서는 코드하지 않은 XML 인코딩 연결 한 문자열 값의 개선 된 버전을 포함하여 SQL에서 문자열을 연결하는 다양한 방법을 다룹니다.

    이 문서에서는 코드하지 않은 XML 인코딩 연결 한 문자열 값의 개선 된 버전을 포함하여 SQL에서 문자열을 연결하는 다양한 방법을 다룹니다.

    SELECT ID, abc = STUFF
    (
        (
            SELECT ',' + name
            FROM temp1 As T2
            -- You only want to combine rows for a single ID here:
            WHERE T2.ID = T1.ID
            ORDER BY name
            FOR XML PATH (''), TYPE
        ).value('.', 'varchar(max)')
    , 1, 1, '')
    FROM temp1 As T1
    GROUP BY id
    

    무슨 일이 일어나고 있는지 이해하기 위해, 내부 쿼리를 시작합니다

    SELECT ',' + name
    FROM temp1 As T2
    WHERE T2.ID = 42 -- Pick a random ID from the table
    ORDER BY name
    FOR XML PATH (''), TYPE
    

    당신이 FOR XML을 지정하고 있기 때문에, 당신은 모든 행을 나타내는 XML 조각을 포함하는 단일 행을 얻을 것이다.

    첫 번째 열에 대한 열 별칭을 지정하지 않았기 때문에, 각 행은 대한의 XML의 PATH 후 괄호에 지정된 이름을 가진 XML 요소에 싸여 될 것이다. 당신이 XML의 PATH ( 'X')에 대해서 가지고 있던 예를 들어, 당신처럼 보인다고 XML 문서를 얻을 것입니다 :

    <X>,aaa</X>
    <X>,bbb</X>
    ...
    

    당신이 요소 이름을 지정하지 않았기 때문에 그러나, 당신은 단지 값의 목록을 얻을 :

    ,aaa,bbb,...
    

    .value는 ( '.', 'VARCHAR (최대)은') 간단히 "특별한"문자를 XML은 인코딩없이, 결과 XML 조각에서 값을 검색합니다. 이제 문자열 그 모습 등이 있습니다 :

    ',aaa,bbb,...'
    

    물건의 기능은 당신에게 최종 결과를 제공, 최고의 쉼표를 제거하는 외모와 같은 :

    'aaa,bbb,...'
    

    그것은 아주 첫눈에 혼란 보이지만, 몇 가지 다른 옵션에 비해 매우 잘 수행하는 경향 않습니다.

  3. ==============================

    3.PATH 모드는 SELECT 쿼리에서 생성 XML에 사용되는

    PATH 모드는 SELECT 쿼리에서 생성 XML에 사용되는

    1. SELECT   
           ID,  
           Name  
    FROM temp1
    FOR XML PATH;  
    
    Ouput:
    <row>
    <ID>1</ID>
    <Name>aaa</Name>
    </row>
    
    <row>
    <ID>1</ID>
    <Name>bbb</Name>
    </row>
    
    <row>
    <ID>1</ID>
    <Name>ccc</Name>
    </row>
    
    <row>
    <ID>1</ID>
    <Name>ddd</Name>
    </row>
    
    <row>
    <ID>1</ID>
    <Name>eee</Name>
    </row>
    

    출력은 결과 집합 내의 각 열 값가 행 요소에 싸여 요소 중심 XML이다. SELECT 절 열 이름에 대한 별칭을 지정하지 않기 때문에, 생성 된 자식 요소 이름은 SELECT 절에서 해당 열 이름과 동일하다.

    행 세트의 각 행에 대한 태그가 부가된다.

    2.
    SELECT   
           ID,  
           Name  
    FROM temp1
    FOR XML PATH('');
    
    Ouput:
    <ID>1</ID>
    <Name>aaa</Name>
    <ID>1</ID>
    <Name>bbb</Name>
    <ID>1</ID>
    <Name>ccc</Name>
    <ID>1</ID>
    <Name>ddd</Name>
    <ID>1</ID>
    <Name>eee</Name>
    

    2 단계의 경우 : 길이가 0 인 문자열을 지정하는 경우, 포장 요소가 생성되지 않습니다.

    3. 
    
        SELECT   
    
               Name  
        FROM temp1
        FOR XML PATH('');
    
        Ouput:
        <Name>aaa</Name>
        <Name>bbb</Name>
        <Name>ccc</Name>
        <Name>ddd</Name>
        <Name>eee</Name>
    
    4. SELECT   
            ',' +Name  
    FROM temp1
    FOR XML PATH('')
    
    Ouput:
    ,aaa,bbb,ccc,ddd,eee
    

    4 단계에서 우리는 값을 연결합니다.

    5. SELECT ID,
        abc = (SELECT   
                ',' +Name  
        FROM temp1
        FOR XML PATH('') )
    FROM temp1
    
    Ouput:
    1   ,aaa,bbb,ccc,ddd,eee
    1   ,aaa,bbb,ccc,ddd,eee
    1   ,aaa,bbb,ccc,ddd,eee
    1   ,aaa,bbb,ccc,ddd,eee
    1   ,aaa,bbb,ccc,ddd,eee
    
    
    6. SELECT ID,
        abc = (SELECT   
                ',' +Name  
        FROM temp1
        FOR XML PATH('') )
    FROM temp1 GROUP by iD
    
    Ouput:
    ID  abc
    1   ,aaa,bbb,ccc,ddd,eee
    

    6 단계에서 우리는 ID로 날짜를 그룹화하고 있습니다.

    다도 (을 source_string, 시작, 길이, add_string) 매개 변수 또는 인수 을 source_string 소스 문자열을 수정할 수 있습니다. 스타트 삭제 길이 자로을 source_string에서 다음 add_string 삽입 위치입니다. 길이 문자의 수는을 source_string에서 삭제합니다. add_string 문자의 순서는 시작 위치에서을 source_string에 삽입합니다.

    SELECT ID,
        abc = 
        STUFF (
            (SELECT   
                    ',' +Name  
            FROM temp1
            FOR XML PATH('')), 1, 1, ''
        )
    FROM temp1 GROUP by iD
    
    Output:
    -----------------------------------
    | Id        | Name                |
    |---------------------------------|
    | 1         | aaa,bbb,ccc,ddd,eee |
    -----------------------------------
    
  4. ==============================

    4.이 정확한 시나리오를 처리 할 수있는 푸른 SQL 데이터베이스 및 (2017로 시작하는) SQL Server의 아주 새로운 기능이 있습니다. 나는 이것이 당신이 XML / 물건 방법으로 달성 하려는지에 대한 기본 공식 방법이 될 것이라고 생각합니다. 예:

    이 정확한 시나리오를 처리 할 수있는 푸른 SQL 데이터베이스 및 (2017로 시작하는) SQL Server의 아주 새로운 기능이 있습니다. 나는 이것이 당신이 XML / 물건 방법으로 달성 하려는지에 대한 기본 공식 방법이 될 것이라고 생각합니다. 예:

    select id, STRING_AGG(name, ',') as abc
    from temp1
    group by id
    

    STRING_AGG - https://msdn.microsoft.com/en-us/library/mt790580.aspx

    편집 : 나는 원래 나는 잠재적 인 기능을 포함하는 것이라고 보았다 생각으로 저는 SQL 서버 2016의 언급 만든이 게시합니다. 하나의 버전을 수정 제안 편집에 대한 감사 나는 잘못이 기억 또는 무언가가 변경되었습니다. 또한, 꽤 감명을 완전히 단지 마지막 옵션에 대한 저를 뽑아 여러 단계의 검토 과정을 인식하지 않았다.

  5. ==============================

    5.XML 경로에서는 다음 태그는 각 행에 첨가 될 것이다 XML 경로 ( 'ENVELOPE')]과 같은 임의의 값을 정의하면 :

    XML 경로에서는 다음 태그는 각 행에 첨가 될 것이다 XML 경로 ( 'ENVELOPE')]과 같은 임의의 값을 정의하면 :

    <ENVLOPE>
    </ENVLOPE>
    
  6. ==============================

    6.

    SELECT ID, 
        abc = STUFF(
                     (SELECT ',' + name FROM temp1 FOR XML PATH ('')), 1, 1, ''
                   ) 
    FROM temp1 GROUP BY id
    

    여기서, 상기 질의 STUFF 함수는 다음이 될 것이다 방금 생성 된 XML 스트링 (AAA, BBB, CCC, DDD, EEE)로부터 제 콤마 (,)를 제거하는 데 사용된다 (단, BBB, CCC, DDD, EEE) .

    그리고 XML의 PATH ( '')의 경우 단순히 (AAA, BBB, CCC, DDD, EEE) 문자열로 열 데이터를 변환하지만, PATH에 우리가 전달하는 '그것이 XML 태그를 생성하지 않도록'.

    그리고 결국에 우리는 ID 열을 사용하여 기록을 분류했다.

  7. ==============================

    7.

    Declare @Temp As Table (Id Int,Name Varchar(100))
    Insert Into @Temp values(1,'A'),(1,'B'),(1,'C'),(2,'D'),(2,'E'),(3,'F'),(3,'G'),(3,'H'),(4,'I'),(5,'J'),(5,'K')
    Select X.ID,
    stuff((Select ','+ Z.Name from @Temp Z Where X.Id =Z.Id For XML Path('')),1,1,'')
    from @Temp X
    Group by X.ID
    
  8. ==============================

    8.나는 디버깅 및 마침내 정상적인 방법의 IT에 내 '박제'쿼리를 반환했다.

    나는 디버깅 및 마침내 정상적인 방법의 IT에 내 '박제'쿼리를 반환했다.

    간단히

    select * from myTable for xml path('myTable')
    

    트리거 I 디버그에서 나에게 로그 테이블에 쓰기에 테이블의 내용을 제공합니다.

  9. ==============================

    9.임 자주 where 절에 사용

    임 자주 where 절에 사용

    SELECT 
    TapuAda=STUFF(( 
    SELECT ','+TBL.TapuAda FROM (
    SELECT TapuAda FROM T_GayrimenkulDetay AS GD 
    INNER JOIN dbo.T_AktiviteGayrimenkul AS AG ON  D.GayrimenkulID=AG.GayrimenkulID WHERE 
    AG.AktiviteID=262
    ) AS TBL FOR XML PATH ('')
    ),1,1,'')
    
  10. from https://stackoverflow.com/questions/31211506/how-stuff-and-for-xml-path-work-in-sql-server by cc-by-sa and MIT license