O solutie poate fi factorizarea codului SQL care este comun celor doua apeluri ale procedurii stocate dbo.MyProc intr-un modul SQL (functie tabelara inline-de preferat, procedura stocata, view) care sa fie apelat de procedura initiala dbo.MyProc (SEELCT 200 coloane) si de o noua procedura dbo.MyProc2 (SELECT 2 coloane).
Un exemplu: daca procedura initiala dbo.MyProc este de forma urmatoare
CREATE PROCEDURE dbo.MyProc
(
params
)
AS
BEGIN
SELECT 200 cols
FROM tabel1 ... tabel 2 ... tabeln
WHERE ...
END;
GO
atunci se poate crea o functie tabelara inline (preferabila din motive de performanta) astfel
CREATE FUNCTIOn dbo.MyFuncBase
(
params
)
RETURNS TABLE
AS
RETURN
SELECT 200 cols
FROM tabel1 ... tabel 2 ... tabeln;
GO
functie care sa fie apelata de procedura stocata initiala
CREATE PROCEDURE dbo.MyProc
(
params
)
AS
BEGIN
SELECT 200 cols
FROM dbo.MyFunctBase(params) AS f
WHERE something ...
END;
GO
si de o noua procedura stocata care va intoarce doar valorile din cele doua coloane care prezinta interes:
CREATE PROCEDURE dbo.MyProc2
(
params
)
AS
BEGIN
SELECT 2 cols
FROM dbo.MyFunctBase(params) AS f
WHERE something else ...
END;
GO
Daca este posibil un asemenea scenariu avantajul (teoretic - trebuiesc realizate teste) este performanta: in cazul apelului EXEC dbo.MyProc2 (care presupune SELECT 2 col2 FROM ) server-ul va avea posibilitatea sa elimine jonctiunile si tabelele/indecsii care nu sunt necesare/i.
Binenteles, ca in doilea caz ai putea sa apelezi direct functia fara sa mai fie necesar
apelul procedurilor stocate.