2015-01-21 2 views
0

Может кто-нибудь объяснить, как FOR XML используется в SQL Server? Это единственный способ конкатенации строк по строкам без использования пользовательской функции? Я получил это от post, сделал то, что мне нужно, но я этого не понимаю.Как работать с XML в SQL Server

Человек, который разместил это, ничего не объяснил. После исчерпывающего поиска я не мог найти ничего понятного. И нет, MSDN не помог мне, учитывая мои ограниченные навыки SQL.

Вот мой SQL, только с теми именами, которые были изменены с той, что была в этом сообщении.

SELECT 
    ID, 
    STUFF((
    SELECT ' -' + Code 
    FROM #Z 
    WHERE (ID = Results.ID) 
    FOR XML PATH(''),TYPE).value('(./text())[1]','NVARCHAR(MAX)'),1,2,'' 
) AS ConcatCode 
FROM #Z Results 
GROUP BY ID 
+3

MSDN [документация] (https://msdn.microsoft.com/en-us/library/ms178107.aspx) представляется довольно ясной. Еще более понятно, как использовать режим «PATH» [здесь] (https://msdn.microsoft.com/en-us/library/ms189885.aspx). –

+0

Это конкретное использование 'FOR XML XPATH' является одним из [хаков] (http://stackoverflow.com/questions/451415/simulating-group-concat-mysql-function-in-sql-server) для выполнения GROUP_CONCAT или ListAgg на сервере Sql. – StuartLC

+0

Ну, я не знаю об атрибутах, элементах или выражениях XPath. Это больше похоже на HTML-жаргон. – Dombey

ответ

1

Это единственный способ конкатенации строк по строкам без использования пользователем функции?

Это самый простой метод для конкатенации строк

как FOR XML используется в SQL Server

Я полагаю, приведенные ниже примеры будут давать более или менее четкое понимание того, как использовать его

------------------------------------------------------------ 
--Create temp table for testing 
IF OBJECT_ID('Tempdb..#Z') IS NOT NULL 
    DROP TABLE #Z 
CREATE TABLE #Z 
    (
     ID INT , 
     SomeText VARCHAR(3) 
    ) 
INSERT INTO #Z 
     (ID, SomeText) 
VALUES (1, 'AAA'), 
     (2, 'BBB'), 
     (3, 'CCC'), 
     (1, 'ZZZ'), 
     (1, 'XXX'), 
     (2, 'YYY') 
------------------------------------------------------------ 
--1. Concatenate 
SELECT SUBSTRING((SELECT ',' + SomeText 
        FROM #Z 
        FOR 
        XML PATH('') 
       ), 2, 1000) AS Concatenated 
------------------------------------------------------------ 
--2. Concatenate for each ID 
SELECT DISTINCT 
     Z_out.id , 
     SUBSTRING((SELECT ',' + SomeText 
        FROM #Z AS Z_in 
        WHERE Z_in.ID = Z_out.id 
        FOR 
        XML PATH('') 
       ), 2, 1000) AS Concatenated 
FROM #Z AS Z_out 
+0

Благодарим за помощь. Некоторые вопросы, 1) Зачем использовать подстроку? 2) Зачем брать в качестве параметра для функции XML PATH? – Dombey

+0

1) подстрока, используемая для удаления первой запятой. 2) Если вы предоставляете пустую строку (FOR XML PATH ('')), не создается элемент оболочки. Для получения дополнительной информации используйте эту ссылку https://msdn.microsoft.com/en-us/library/ms190922.aspx – Vasily