Как работает FOR XML PATH('') при объединении строк

Как работает FOR XML PATH ('') предложение делать свою работу при объединении строк в SQL Server?

Я просто хочу объяснить, как FOR XML PATH ('') пункт работает...

1 ответ

Решение

Какие FOR XML PATH('xxx') делает это создать строку XML для набора результатов, который помещает каждую строку в <xxx></xxx> element и значение каждого столбца внутри строки, в элементе с именем для этого столбца.

Если PATH пуст (т.е. PATH('')) он пропускает элемент строки в генерации XML. Если столбец не имеет имени, он пропускает элемент столбца в генерации XML. Когда оба PATH пусты, а столбцы не имеют имен, они фактически становятся объединением строк всех строк.

Выполните следующие инструкции, чтобы лучше понять процесс:

-- Each row is in a <beta></beta> element
-- Each column in that row in a <alfa></alfa> element (the column name)
SELECT
    alfa=','+TABLE_SCHEMA + '.' + TABLE_NAME
FROM
    INFORMATION_SCHEMA.TABLES
FOR
    XML PATH('beta');

-- Since the PATH is empty, the rows are not put inside an element
-- Each column in that row is in a <alfa></alfa> element (the column name)
SELECT
    alfa=','+TABLE_SCHEMA + '.' + TABLE_NAME
FROM
    INFORMATION_SCHEMA.TABLES
FOR
    XML PATH('');

-- Since the PATH is empty, the rows are not put inside an element
-- Since the column has no name it is not put inside an element     
SELECT
    ','+TABLE_SCHEMA + '.' + TABLE_NAME
FROM
    INFORMATION_SCHEMA.TABLES
FOR
    XML PATH('');

-- This uses the STUFF function to remove the leading comma to get a proper comma-seperated list    
SELECT STUFF((
    SELECT
        ','+TABLE_SCHEMA + '.' + TABLE_NAME
    FROM
        INFORMATION_SCHEMA.TABLES
    FOR
        XML PATH('')
    ),1,1,''
) AS comma_seperated_list;

Теперь я слышу, как вы спрашиваете: как я могу удалить имя столбца, когда я просто выбираю столбец из таблицы. Есть несколько способов, в порядке моего предпочтения:

  • Свойства XQuery: SELECT [text()]=column_name ...
  • Используйте подзапрос, чтобы выбрать значение столбца: SELECT (SELECT column_name) ...
  • CAST столбец к его типу: SELECT CAST(column_value AS <TYPE of the column>) ...

Примеры:

SELECT
    [text()]=TABLE_NAME
FROM
    INFORMATION_SCHEMA.TABLES
FOR
    XML PATH('');

SELECT
    (SELECT TABLE_NAME)
FROM
    INFORMATION_SCHEMA.TABLES
FOR
    XML PATH('');

SELECT
    CAST(TABLE_NAME AS SYSNAME)
FROM
    INFORMATION_SCHEMA.TABLES
FOR
    XML PATH('');
Другие вопросы по тегам