我正在尝试优化查询以删除返回逗号分隔列表示例“cor tag 1,tag test,testing,test”的标量值函数。我在网上读到,使其内联应该会提高性能。有人可以帮助使我的 UserDefinedFunction 内联或建议如何提高性能吗?
-- Description: Returns a comma separated list of Tags for a defined Course Enrolment
--
-- =============================================
/****** Object: UserDefinedFunction [dbo].[fn_ConcatenateCourseEnrolmentTags]
CREATE FUNCTION [dbo].[fn_ConcatenateCourseEnrolmentTags] (@ClientOfferRegID As int)
RETURNS nvarchar(3999) AS
BEGIN
DECLARE @Desc nvarchar(3999)
SELECT @Desc = IsNull(@Desc + ', ', '') + dbo.tbl_Tag_Shared.Name
FROM dbo.tbl_Tag_Shared INNER JOIN
dbo.tbl_Record_Tag ON dbo.tbl_Tag_Shared.TagId = dbo.tbl_Record_Tag.TagId INNER JOIN
dbo.tbl_Entity ON dbo.tbl_Tag_Shared.EntityId = dbo.tbl_Entity.EntityId
WHERE (dbo.tbl_Entity.ObjectId = '06') AND (dbo.tbl_Record_Tag.RecordId = @ClientOfferRegID)
ORDER BY dbo.tbl_Tag_Shared.Name
RETURN @Desc
END
GO
SELECT
tbl_Client.ClientID AS LearnerId,
tbl_Client.FirstName AS LearnerFirstName,
tbl_Client.LastName AS LearnerLastName,
dbo.fn_ConcatenateCourseEnrolmentTags(tbl__Client_Offer_Reg.ClientOfferRegID) AS Tags,
FROM
tbl_Client
...
GROUP BY
tbl_Client.ClientID,
tbl_Client.FirstName,
tbl_Client.LastName,
dbo.fn_ConcatenateCourseEnrolmentTags(tbl_Client_Offer_Reg.ClientOfferRegID),
是的,可以使用函数 STRING_AGG 在 SQL 中进行子查询
尝试下面的例子。
SELECT
tbl_Client.ClientID AS LearnerId,
tbl_Client.FirstName AS LearnerFirstName,
tbl_Client.LastName AS LearnerLastName,
ISNULL((select STRING_AGG(tbl__Client_Offer_Reg.ClientOfferRegID, ', ')
from tbl_Client as ClientInner
where ClientOuter.ClientID = ClientInner.ClientID
And ClientOuter.FirstName = ClientInner.FirstName
And ClientOuter.LastName = ClientInner.LastName),'-') As Tags
FROM
tbl_Client as ClientOuter
...
GROUP BY
tbl_Client.ClientID,
tbl_Client.FirstName,
tbl_Client.LastName,
您可以使用 XML 格式化功能(假设您使用的是 SQL Server),它非常常用于此:
SELECT ',' + ColumnName ... FOR XML PATH('')
您可以在此处找到示例: SELECT ... FOR XML PATH(' '),1,1) 是什么意思?