Dalam kebanyakan kasus, sebaiknya hindari fungsi bernilai skalar yang mereferensikan tabel karena (seperti yang dikatakan orang lain) pada dasarnya adalah kotak hitam yang perlu dijalankan sekali untuk setiap baris, dan tidak dapat dioptimalkan oleh mesin rencana kueri. Oleh karena itu, mereka cenderung menskalakan secara linier bahkan jika tabel terkait memiliki indeks.
Anda mungkin ingin mempertimbangkan untuk menggunakan fungsi bernilai tabel sebaris, karena fungsi tersebut dievaluasi sebaris dengan kueri, dan dapat dioptimalkan. Anda mendapatkan enkapsulasi yang Anda inginkan, tetapi kinerja menempelkan ekspresi tepat di pernyataan pilih.
Sebagai efek samping dari inline, mereka tidak dapat berisi kode prosedural (tidak mendeklarasikan @variable; set @variable =..; return). Namun, mereka dapat mengembalikan beberapa baris dan kolom.
Anda dapat menulis ulang fungsi Anda seperti ini:
create function usf_GIS_GET_LAT(
@City varchar (30),
@State char (2)
)
returns table
as return (
select top 1 lat
from GIS_Location with (nolock)
where [State] = @State
and [City] = @City
);
GO
create function usf_GIS_GET_LON (
@City varchar (30),
@State char (2)
)
returns table
as return (
select top 1 LON
from GIS_Location with (nolock)
where [State] = @State
and [City] = @City
);
Sintaks untuk menggunakannya juga sedikit berbeda:
select
Lat.Lat,
Lon.Lon
from
Address_Location with (nolock)
cross apply dbo.usf_GIS_GET_LAT(City,[State]) AS Lat
cross apply dbo.usf_GIS_GET_LON(City,[State]) AS Lon
WHERE
ID IN (SELECT TOP 100 ID FROM Address_Location WITH(NOLOCK) ORDER BY ID DESC)