我正在检查使用它可以很好地处理特殊字符,但同时会使查询产生一个"基数估计警告"
如果我使用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
答案 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;