使用FOR XML PATH,TYPE).value('。[1]',' nvarchar(max)')

时间:2017-10-17 17:16:53

标签: sql-server

我正在检查使用它可以很好地处理特殊字符,但同时会使查询产生一个"基数估计警告"

如果我使用FOR XML PATH(''),查询计划要好得多,并且基数已经消失。以前有人遇到过这个问题吗?是否有任何解决方法继续使用FOR XML PATH,TYPE).value('。[1]',' nvarchar(max)')并摆脱基数问题?

SELECT r.ServiceId,

        STUFF(
                (
            SELECT '; ' + u.Name 
                FROM dbo.UsedFor u
                inner join dbo.ServiceUsedRelation r2
                    on u.UsedId = r2.UsedId
                where
                    r2.ServiceId = r.ServiceId
                FOR XML PATH, TYPE).value('.[1]','nvarchar(max)')          
                , 1
                , 1
                , ''
    ) as Name
     FROM dbo.ServiceUsedRelation r
     GROUP BY r.ServiceId

1 个答案:

答案 0 :(得分:0)

停止使用FOR XML PATH进行连接。如果您使用的是SQL Server 2017,则可以使用STRING_AGG。如果没有,您可以实现SQL String Utility Functions - 查找Concatenate类。更多信息可以找到here

具有连接字符串但同时聚合的函数,使您能够编写更复杂的分组查询。它还简化了使用的T-SQL语法并提高了性能。

例如,您的查询将如下所示:

SELECT ServiceId
      ,[dbo].[Concatenate] (Name)
FROM dbo.ServiceUsedRelation
GROUP BY ServiceId;