文字条款说明

时间:2018-12-10 14:45:51

标签: sql-server

我正在使用以下代码,这些代码是我在第三方网站上发现的,以帮助连接某些数据(该代码有效,我只是想更好地理解它)。但是,我在辨别第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

3 个答案:

答案 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