我正在使用以下代码,这些代码是我在第三方网站上发现的,以帮助连接某些数据(该代码有效,我只是想更好地理解它)。但是,我在辨别第4行中的[[text()]“子句和第8行中的('')时遇到了麻烦(SQL的新手)。
SELECT DISTINCT ST2.[Financial Number],
SUBSTRING(
(
SELECT ','+ST1.[Clinical Event Result] AS [text()]
FROM ED_FCT_Q1_FY19 ST1
WHERE ST1.[Financial Number] = ST2.[Financial Number]
Order BY [Financial Number]
FOR XML PATH ('')
), 2, 1000) [Clinical]
FROM ED_FCT_Q1_FY19 ST2
答案 0 :(得分:2)
根据the documentation,在使用FOR XML的PATH模式时,
对于名称为text()的列,该列中的字符串值 添加为文本节点
因此,在这种情况下,该列不会像在常规SELECT
查询中那样被视为列名别名,而是用于XML映射。
答案 1 :(得分:0)
在这种情况下,TEXT()只是别名,用作列名。这不是功能。这里没有太多需要了解的内容。
答案 2 :(得分:0)
您曾在上一个问题中要求对此代码进行澄清,但是当我看到它时,我没有时间回答它,看来您现在已经把这个问题记下来了。
您发布的代码段是一种通用方法的实现,该方法可以从结果列创建逗号分隔的值列表。最常用的变体使用STUFF
,但是这个变体使用SUBSTRING
,这很好。确实,FOR XML
确实在这里发挥了作用。
从广义上讲,括号内的FOR XML
子查询会拉出要连接的值的列表,并在每个值的前面加一个,
。通过将这些结果转储到XML文档中,您将获得一个逗号分隔的列表。 AS [text()]
用作指向文本节点的指针,如Dan Guzman的回答所述。
SUBSTRING
正在获取该列表,从位置2开始并持续1000个字符。从功能上讲,只需去除第一个逗号,除非您的列表超出1000个字符,在这种情况下,您会被截断,这可能是您想要的,也可能不是。
此问题中的机制有更详细的说明:How Stuff and 'For Xml Path' work in Sql Server。因为您发现的实现未使用STUFF
,所以您不太可能找到它。
另请参见(由Dan的评论提供)https://dba.stackexchange.com/questions/207371/please-explain-what-does-for-xml-path-type-value-nvarcharmax