У меня есть хранимая процедура, которая занимает очень много времени, потому что у меня есть 2 вызова функций, которые вызывают перед PIVOT, что означает, что он вызывает функции 5 раз для каждой записи, а не один раз для каждой записи , Как я могу переписать мой запрос так, чтобы 2 вызова функций в конце запроса выполнялись после Pivot, а не раньше?Вызов SQL-функций после PIVOT
Вот запрос
CREATE TABLE #Temp
(
ServiceRecordID INT,
LocationStd VARCHAR(1000),
AreaServedStd VARCHAR(1000),
RegionalLimited BIT,
Region VARCHAR(255),
Visible BIT
)
DECLARE @RegionCount INT
SELECT @RegionCount = COUNT(RegionID) FROM Regions WHERE SiteID = @SiteID AND RegionID % 100 != 0
INSERT INTO #Temp
SELECT TOP (@RegionCount * 100) SR.ServiceRecordID, SR.LocationStd, SR.AreaServedStd, SR.RegionalLimited, R.Region,
CASE WHEN (ISNULL(R_SR.RegionID,0) = 0 AND ISNULL(R_SR_Serv.RegionID,0) = 0) THEN 0 ELSE 1 END AS Visible
FROM ServiceRecord SR
INNER JOIN Sites S ON SR.SiteID = S.SiteID
INNER JOIN Regions R ON R.SiteID = S.SiteID
LEFT OUTER JOIN lkup_Region_ServiceRecord R_SR ON R_SR.RegionID = R.RegionID AND R_SR.ServiceRecordID = SR.ServiceRecordID
LEFT OUTER JOIN lkup_Region_ServiceRecord_Serv R_SR_Serv ON R_SR_Serv.RegionID = R.RegionID AND R_SR_Serv.ServiceRecordID = SR.ServiceRecordID AND SR.RegionalLimited = 0
WHERE SR.SiteID = @SiteID
AND R.RegionID % 100 != 0
ORDER BY SR.ServiceRecordID
DECLARE @RegionList varchar(2000),@SQL varchar(max)
SELECT @RegionList = STUFF((SELECT DISTINCT ',[' + Region + ']' FROM #Temp ORDER BY ',[' + Region + ']' FOR XML PATH('')),1,1,'')
SET @SQL='SELECT * FROM
(SELECT ServiceRecordID,
dbo.fn_ServiceRecordGetServiceName(ServiceRecordID,'''') AS ServiceName,
LocationStd,
AreaServedStd,
RegionalLimited,
Region As Region,
dbo.fn_GetOtherRegionalSitesForServiceRecord(ServiceRecordID) AS OtherSites,
CAST(Visible AS INT) AS Visible FROM #Temp) B PIVOT(MAX(Visible) FOR Region IN (' + @RegionList + ')) A'
EXEC(@SQL)
Да, вы должны иметь возможность заменить 'select *' фактическими именами столбцов, и вы можете использовать функцию для столбцов. – Taryn
Упрощение: 'CASE WHEN R_SR.RegionID <> 0 И R_SR_Serv.RegionID <> 0 THEN 1 ELSE 0 END AS Visible' – ErikE
спасибо bluefeet, не уверен, что я следую. У меня есть столбцы, которые выбираются индивидуально уже, не так ли? –