Sql server SQL Server“FOR XML”编码HTML实体?
我正在使用SQLServerManagementStudio。我继承了一个查询,该查询的一个部分如下所示: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
...
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,