SQL不是我最好的東西,但我一直在試圖優化這個存儲過程。它有多個標量值函數,我試圖改變爲表值函數,因爲我在很多地方讀過它,這是一種更有效的方法。現在我有他們,但不確定如何實現,或者如果我可能只是沒有正確創建它們。SELECT語句中的SQL表值函數
這是我打來的功能。
Alter FUNCTION [IsNotSenateActivityTableValue]
(
@ActivityCode int,
@BillId int,
@TextToDisplay varchar(max)
)
returns @T table(result varchar(max))
as
begin
DECLARE @result varchar(max);
declare @countcodes int;
declare @ishousebill int;
select @ishousebill = count(billid)
from BillMaster
where BillID = @BillID and Chamber = 'H'
If (@ishousebill = 0)
begin
SELECT @countcodes = count([ActivityCode])
FROM [HouseCoreData].[dbo].[ActivityCode]
where ActivityDescription not like '%(H)%' and ActivityType = 'S'
and [ActivityCode] = @ActivityCode
if (@countcodes = 0)
begin
set @result = 'test'
end
else
begin
set @result = 'test2'
end
end
else
begin
set @result = @TextToDisplay
end
RETURN
END
這就是我想要這樣稱呼他們的方式。我希望能夠把他們放在最前面,但真正有用的東西是好的。
SELECT distinct
ActionDates.result as ActionDate
,ActivityDescriptions.result as ActivityDescription
FROM BillWebReporting.vwBillDetailWithSubjectIndex as vw
left outer join [BillWebReporting].[HasHouseSummary] as HasSummary on vw.BillID = HasSummary.BillID
outer APPLY dbo.IsNotSenateActivityDateTableValue(ActivityCode,vw.BillID,[ActionDate]) ActionDates
OUTER APPLY dbo.IsNotSenateActivityTableValue(ActivityCode,vw.BillID,[ActivityDescription]) as ActivityDescriptions
標籤上寫着'mysql',但是這看起來很* *很像T-SQL和SQL Server 。 – RBarryYoung
你的功能是否真的有效?你在哪裏插入@T?它只是意味着返回一行嗎? –
此外,最有效的表值函數類型是一個內聯表值函數(它只有一個'RETURN(SELECT ...);'而沒有其他這些代碼位)。一個多語句表值函數,就像您要編寫的函數一樣,實際上很容易出現很多與您要避免的相同的性能問題。 –