SQL Server «FOR XML», кодирующий сущности HTML? - PullRequest
0 голосов
/ 17 октября 2019

Я использую SQL Server Management Studio. Я унаследовал запрос, у которого есть раздел, который выглядит следующим образом:

...
ISNULL(
CASE
    WHEN LOWER(PersonClass.Detail) LIKE '%student%'
    THEN SUBSTRING((
            SELECT DISTINCT
                ' / '+STUDENT_TERM.DEPT_NAME
            FROM Warehouse.STUDENT_TERM STUDENT_TERM
                INNER JOIN Warehouse.TERM TERM
                    ON STUDENT_TERM.TERM_CD = TERM.TERM_CD
                    AND TERM.TERM_START_DT <= @fyEnd
                    AND ISNULL(TERM.TERM_END_DT, GETDATE()) >= @fyStart
            WHERE Persons.DWPersonId = STUDENT_TERM.DWPERSID FOR
            XML PATH('')
    ), 4, 100000)
END, '') AS StudentHome,
...

Это поиск «домашнего отдела» студента. Существует вероятность того, что у ученика может быть более одного дома, поэтому вышеприведенное работает немного как MySQL group_concat.

. Мой вопрос о непреднамеренном артефакте запроса. У нескольких отделов есть имена в хранилище данных, в которые встроены амперсанды &, например:

A & B

В результате запроса "HTML-кодировка" превращает "A & B" в "A & B". Msgstr ".

Если я выполню внутренний запрос, результат будет, как и ожидалось, с простым амперсандом, а не в закодированной форме. Я предполагаю, что FOR XML выполняет кодирование.

Есть ли способ сделать group_concat без кодирования результата?

1 Ответ

1 голос
/ 17 октября 2019

Вы можете получить значение из xml вместо преобразования в строку:

ISNULL(
CASE
    WHEN LOWER(PersonClass.Detail) LIKE '%student%'
    THEN SUBSTRING((
            SELECT DISTINCT
                ' / '+STUDENT_TERM.DEPT_NAME
            FROM Warehouse.STUDENT_TERM STUDENT_TERM
                INNER JOIN Warehouse.TERM TERM
                    ON STUDENT_TERM.TERM_CD = TERM.TERM_CD
                    AND TERM.TERM_START_DT <= @fyEnd
                    AND ISNULL(TERM.TERM_END_DT, GETDATE()) >= @fyStart
            WHERE Persons.DWPersonId = STUDENT_TERM.DWPERSID FOR
            XML PATH(''),TYPE
    ).value(N'.','nvarchar(max)') , 4, 100000)
END, '') AS StudentHome,
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...