Sql server SQL Server“FOR XML”编码HTML实体?

Sql server SQL Server“FOR XML”编码HTML实体?,sql-server,ssms,Sql Server,Ssms,我正在使用SQLServerManagementStudio。我继承了一个查询,该查询的一个部分如下所示: ... ISNULL( CASE WHEN LOWER(PersonClass.Detail) LIKE '%student%' THEN SUBSTRING(( SELECT DISTINCT ' / '+STUDENT_TERM.DEPT_NAME FROM Warehouse.STUDEN

我正在使用SQLServerManagementStudio。我继承了一个查询,该查询的一个部分如下所示:

...
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,
...
不过,查询的结果是HTML编码的,将A&B转换为A&;B

如果我运行内部查询,结果与预期的一样,是一个简单的符号,而不是编码形式。我猜FOR XML正在进行编码


有没有一种方法可以在不编码结果的情况下进行分组计算?

您可以从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,

您所使用的任何语言都应该有一个标准库,它可以将html实体转换回原来的格式,而不是子字符串。通常最好使用STUFF,从字符串的开头删除字符。@Larnu-为什么?因为如果OP的字符数超过10000个,它将被截断。@Hogan说,这些东西只是用来替换第一个字符,它无法截断它。
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,