SQL 服务器 "FOR XML" 编码 HTML 个实体?
SQL Server "FOR XML" encoding HTML entities?
我正在使用 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,
...
这是在寻找学生的"home department"。一个学生可能有不止一个家,所以上面的工作有点像 MySQL 的 group_concat
.
我的问题是关于查询的意外产物。一些部门在数据仓库中的名称中嵌入了符号 &
,例如:
A & B
虽然查询的结果是 "HTML encoded" 将 "A & B" 变成 "A & B"。
如果我 运行 内部查询结果与预期的一样,只是一个简单的符号而不是编码形式。我猜 FOR XML
正在编码。
有没有办法在不对结果进行编码的情况下执行 group_concat
?
您可以从 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,
我正在使用 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,
...
这是在寻找学生的"home department"。一个学生可能有不止一个家,所以上面的工作有点像 MySQL 的 group_concat
.
我的问题是关于查询的意外产物。一些部门在数据仓库中的名称中嵌入了符号 &
,例如:
A & B
虽然查询的结果是 "HTML encoded" 将 "A & B" 变成 "A & B"。
如果我 运行 内部查询结果与预期的一样,只是一个简单的符号而不是编码形式。我猜 FOR XML
正在编码。
有没有办法在不对结果进行编码的情况下执行 group_concat
?
您可以从 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,