Czy można wyniki z procedury składowanej wykorzystać w klauzuli Select?
SELECT col1, col2 FROM EXEC MyStoredProc param1, param2
Jeśli tak napiszę, to otrzymuję komunikat błędu.
Czy można wyniki z procedury składowanej wykorzystać w klauzuli Select?
SELECT col1, col2 FROM EXEC MyStoredProc param1, param2
Jeśli tak napiszę, to otrzymuję komunikat błędu.
Standardowo w T-SQL-u nie ma takiej możliwości. Wynik procedury składowanej nie może być użyty w klauzuli from.
Ale okazuje się, że jest kilka sposobów na rozwiązanie tego problemu:
1. Table-Value Functions
Jednym z rozwiązań jest zastąpienie procedury składowanej funkcją Table-Value Functions, czyli taką, która zwraca zmienną tablicową.
Przykład:
create function MyFunc(@ProductId int) returns @T Table (UnitPrice decimal, Qty int) as begin insert into @T (UnitPrice, Qty) select UnitPrice, OrderQty from SalesLT.SalesOrderDetail where ProductID = @ProductId return end
Wówczas możemy użyć tej funkcji bezpośrednio we from:
select * from MyFunc(905)
Ograniczeniem tego rozwiązania jest to, że nie możemy tego zastosować do już istniejącej procedury składowanej.
2. OpenQuery
Innym sposobem jest zastosowanie funkcji OpenQuery, która umożliwia uruchomienie dowolnego kodu SQL.
Przykład:
SELECT * FROM OPENQUERY(YOURSERVERNAME, 'EXEC MyProc @parameters') WHERE somefield = anyvalue
Ale uwaga, zadziała tylko w przypadku Linked Server.
3. Zmienna tablicowa
Istnieje jeszcze jeden ciekawy sposób. Wyniki procedury składowanej możemy skierować do zmiennej tablicowej.
Przykład:
declare @MyTable Table (UnitPrice decimal, Qty int) insert @MyTable exec MyStoredProc 905 Select * from @MyTable
4. Tabela tymczasowa
Wyniki procedury składowanej możemy skierować do tabeli tymczasowej.
Przykład:
create table #MyTable (UnitPrice decimal, Qty int) insert #MyTable exec MyStoredProc 905 Select * from #MyTable