Удивлен, никто не дал вам актуальный ответ. Курсоры плохие. Вам нужно переместить логику SP в табличную функцию (TVF) и затем использовать CROSS APPLY
Вот запрос, который я написал вчера (не останавливайтесь на деталях, просто посмотрите на CROSS APPLY
). CROSS APPLY
создает объединение таблиц. Каждый элемент этого объединения генерируется из TVF, который параметризован в записях строк оператора select.
SELECT supt.hostname,supt.scriptname, COUNT(*)
FROM Event_Pagehit eph
INNER JOIN Symboltable_urlpair supf
ON eph.fromPagePair=supf.id
INNER JOIN Symboltable_urlpair supt
ON supt.id=eph.toPagePair
CROSS APPLY dbo.TDFCompanyFormationsUrlClassification(supf.hostname,supf.scriptname) as x
CROSS APPLY dbo.TDFCompanyFormationsUrlClassification(supt.hostname,supt.scriptname) as y
WHERE x.isCompanyFormations=1
AND y.isCompanyFormations=0
GROUP BY supt.hostname,supt.scriptname
ORDER BY COUNT(*) desc
Я могу использовать x
и y
, как если бы они были таблицами, извлеченными из предложений FROM
или JOIN
. Если бы мне пришлось написать этот запрос без TVF, он бы занимал пару сотен строк.
Примечание:
Если вы не можете переписать SP: вы должны иметь возможность вставить результат хранимой процедуры в таблицу результатов из табличной функции. Я никогда не делал этого, и иногда различные конструкции SQL-сервера имеют предостережения - поэтому, если кто-то не скажет иначе, я предполагаю, что это так.