我继承了一个存储过程,该存储过程在子选择中使用 FOR XML PATH 将子选择中的多个结果行连接到“主”查询上的单个结果列中。请考虑以下情况,其中表“z”是主查询的 FROM 子句的一部分:
SELECT SUBSTRING((SELECT ('; ' + RTRIM(c.SomeField))
FROM a (NOLOCK)
INNER JOIN b (NOLOCK) ON a.aid = b.aid
INNER JOIN c (NOLOCK) ON b.cid = c.cid
WHERE a.zid = z.zid
FOR XML PATH('')), 3, 1000)
如果子选择中有三个结果行,则返回以下内容:
value1; value2; value3
大多数时候,这非常有效。然而,c.SomeField
的几个值(它是一个 varchar)包含特殊的 XML 字符,最常见的是“&”号。因此,当其中一个值包含 & 符号时,我得到以下结果:
value1 & more value1; value2; value3
还有其他方法可以将这些行结果连接在一起吗?如果没有,是否有一种简单的方法可以在.NET 中解码字符串?
最佳答案
来自 MVP Rob Farley :
SELECT SUBSTRING((
SELECT ('; ' + RTRIM(c.SomeField))
FROM a (NOLOCK)
INNER JOIN b (NOLOCK) ON a.aid = b.aid
INNER JOIN c (NOLOCK) ON b.cid = c.cid
WHERE a.zid = z.zid
FOR XML PATH(''), ROOT('xml'), TYPE
).value('/xml[1]','varchar(max)'), 3, 1000)
他指出:
However, if I actually make my FOR XML call return actual well-formed XML, then I can extract the contents out, and it returns the data to me in its original (correct) form.
关于.net - 在不使用 FOR XML PATH 的情况下将多个结果行连接成单个结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3532909/