У меня есть следующий (слегка упрощенный в возвращаемых столбцах) запрос.
select Products.Product, Products.ID, Products.Customers
from Products
where Products.orderCompleteDate is null
В качестве примера будет возвращено
productA 1 Bob
productA 1 Jane
productB 2 John,Dave
Обратите внимание, что клиенты могут быть разделены запятойсписок.То, что я хочу добавить, это столбец «Расположение клиентов», так что выше становится
productA 1 Bob Ireland
productA 1 Jane Wales
productB 2 John,Dave Scotland,England
Я создал функцию ниже, где fn_split возвращает одну строку для каждого элемента с разделителями.
create FUNCTION [dbo].[GetLocations] (@CustomerNames Varchar(256) )
RETURNS @TempLocations table (CustomerLocations varchar(256)) AS begin
declare @NameStr varchar(256)
declare @temp table(singleLoc varchar(256))
insert into @temp
select CustomerLocation.Location from CustomerLocation
INNER JOIN Customers ON Customers.ID = CustomerLocation.ID
INNER JOIN dbo.fn_Split(@CustomerNames,',') split ON split.Item = Customers.Name
SELECT @NameStr = COALESCE(@NameStr + ',', '') + singleLoc
FROM @temp
insert into @TempLocations values (@NameStr)
return
end
И применил его к исходному запросу следующим образом
select Products.product, Products.ID, Products.Customers, Locations.CustomerLocations
from Products
OUTER APPLY dbo.GetLocations(Products.Customers,',') AS Locations
where Products.orderCompleteDate is null
Однако это чрезвычайно медленно: запрос занимает ~ 10 секунд для таблицы, содержащей всего 2000 строк (первоначальный запрос выполняется почти мгновенно).Это говорит о том, что запрос не удалось оптимизировать, и он создается построчно.По этой причине я держался подальше от скалярных функций и пытался придерживаться табличных функций.Есть ли явная ошибка в моей логике / коде?