SQL使用FOR XML PATH字符串聚合时语法报错,求排查原因
问题分析与解决
错误原因
你遇到的'FOR'附近语法不正确错误,核心是SQL语法结构错误——第一个子查询里多了一个多余的右括号。
看你代码里的这段:
SELECT STUFF((SELECT -- Prepend with delimiter and escape internal delimiters DIMENSIONSEGMENTDELIMITER) -- 这里的右括号是多余的! FROM (SELECT TOP (1) DH.RECID ...
这个多余的)会提前闭合STUFF里的子查询,导致后续的FROM、JOIN、ORDER BY、FOR XML等语句失去合法上下文,数据库解析器因此在FOR位置报错。
修正后的代码
删掉那个多余的右括号即可,修正后的完整代码如下:
SELECT STUFF((SELECT -- Prepend with delimiter and escape internal delimiters DIMENSIONSEGMENTDELIMITER FROM (SELECT TOP (1) DH.RECID FROM dw.DIMENSIONHIERARCHY DH JOIN dw.DIMENSIONHIERARCHYINTEGRATION DHI ON DHI.DIMENSIONHIERARCHY = DH.RECID AND DHI.ISDEFAULT = 1 --AND DHI.PARTITION = T1.PARTITION WHERE --DH.PARTITION = T1.PARTITION DH.STRUCTURETYPE = 17) AS DH JOIN dw.DIMENSIONHIERARCHYLEVEL DHL ON DHL.DIMENSIONHIERARCHY = DH.RECID JOIN dw.DIMENSIONATTRIBUTE DA ON DA.RECID = DHL.DIMENSIONATTRIBUTE LEFT JOIN (SELECT DIMENSIONATTRIBUTE, DISPLAYVALUE FROM (SELECT * FROM dw.DIMENSIONATTRIBUTEVALUESET DAVS --WHERE DAVS.PARTITION = T1.PARTITION --AND DAVS.RECID = T1.RECID ) P UNPIVOT (DISPLAYVALUE for DIMENSIONATTRIBUTE IN (D1_BUSINESSLINEVALUE, D2_SITEVALUE, D3_DEPARTMENTVALUE, D4_COSTCENTERVALUE, D5_PURPOSEVALUE)) AS DIMENSIONVALUECOLUMNNAME ) AS DIMLIST ON DIMLIST.DIMENSIONATTRIBUTE = REPLACE(DA.DIMENSIONVALUECOLUMNNAME COLLATE Database_Default, '.', '$') ORDER BY DHL.DIMENSIONHIERARCHY, DHL.LEVEL_ FOR XML PATH(''), TYPE ).value('(./text())[1]', 'NVARCHAR(MAX)'), 1, LEN(DIMENSIONSEGMENTDELIMITER), '') AS NonNullDisplayValue
关于聚合字符串拼接的疑问
从代码风格判断你使用的是SQL Server,它完全支持用FOR XML PATH的方式实现聚合字符串拼接,你的思路是正确的,只是语法细节出错,和功能支持无关。
内容的提问来源于stack exchange,提问作者Siddcity
相关产品推荐
相关产品推荐

