W niektórych przypadkach z SQL Server może wystąpić sytuacja, w której chcesz pobrać dane wynikowe z procedury składowanej i wstawić je do tabeli tymczasowej do użycia w innym zapytaniu. Ustalenie, jak wykonać to zadanie, może być nieco trudne, dlatego pokrótce przedstawimy kilka opcji, w zależności od konkretnych potrzeb i konfiguracji bazy danych.
Zanim przyjrzymy się konkretnym metodom, stwórzmy przykładową procedurę. Chociaż nie jest to szczególnie przydatne, utwórzmy BooksByPrimaryAuthor
procedura, która akceptuje @PrimaryAuthor
parametr i pobiera rekordy z naszych books
tabela, w której ten @PrimaryAuthor
mecze. Instrukcja generowania procedury może wyglądać tak:
CREATE PROC BooksByPrimaryAuthor
@PrimaryAuthor nvarchar(100)
AS
BEGIN
SELECT
*
FROM
books
WHERE
primary_author = @PrimaryAuthor;
END
GO
Idealnie, chcielibyśmy zrobić coś takiego, gdzie SELECT
dane wynikowe z naszej procedury i wstawiamy je do tabeli tymczasowej:
SELECT
*
INTO
#tmpSortedBooks
FROM
EXEC BooksByPrimaryAuthor 'Tolkien'
Problem polega na tym, że powyższa składnia jest niewłaściwa i nie będzie działać . Potrzebujemy nowej metody.
Korzystanie z instrukcji OPENROWSET
Jedną z możliwości jest użycie OPENROWSET
oświadczenie, które umożliwia dostęp do zdalnych danych ze źródła OLE DB i może być wykonane bezpośrednio z innej instrukcji SQL. OPENROWSET
jest jednorazową metodą połączenia i pobierania danych, więc nie powinna być wykorzystywana do częstych połączeń (w takim przypadku preferowane są serwery łączące).
OPENROWSET
może być celem każdego INSERT
, DELETE
lub UPDATE
oświadczenie, co czyni go idealnym do naszych celów „wykonywania” naszej procedury składowanej dla nas i wyodrębniania tych danych z powrotem do naszej oczekującej tabeli tymczasowej.
Przed użyciem OPENROWSET
, może być konieczne zmodyfikowanie niektórych opcji konfiguracyjnych, w szczególności poprzez zezwolenie na dostęp ad hoc. Można to skonfigurować za pomocą następujących instrukcji:
sp_configure 'Show Advanced Options', 1
GO
RECONFIGURE
GO
sp_configure 'Ad Hoc Distributed Queries', 1
GO
RECONFIGURE
GO
Teraz możemy wykorzystać OPENROWSET
, który ma określoną składnię, której należy przestrzegać:
OPENROWSET(
<PROVIDER_NAME>,
<DATA_SOURCE>,
<OPTIONS>
)
W ten sposób możemy wykonać naszą procedurę składowaną za pomocą OPENROWSET
i przekaż go do naszej tabeli tymczasowej w następujący sposób:
SELECT
*
INTO
#tmpSortedBooks
FROM
OPENROWSET(
'SQLNCLI',
'Server=(local)\SQL2008;Trusted_Connection=yes;',
'EXEC BooksByPrimaryAuthor Tolkien'
)
Może być konieczna zmiana PROVIDER_NAME
i DATA_SOURCE
wartości do własnych celów.
Korzystanie z funkcji zdefiniowanej przez użytkownika
Istnieje kilka wad OPENROWSET
metoda, a mianowicie, że wymaga uprawnień/konfiguracji ad hoc, jak widzieliśmy powyżej, a także OPENROWSET
jest w stanie zwrócić tylko jeden zestaw wyników (jeśli podano wiele zestawów, zwracany jest tylko pierwszy zestaw wyników).
Dlatego inną metodą wykonania tego zadania jest efektywne zastąpienie procedury składowanej funkcją zdefiniowaną przez użytkownika.
W naszym przykładzie wyglądałoby to mniej więcej tak:
CREATE FUNCTION BooksByPrimaryAuthor
(
@PrimaryAuthor nvarchar(100)
)
RETURNS TABLE
AS
RETURN
SELECT
*
FROM
books
WHERE
primary_author = @PrimaryAuthor;
GO
Ta funkcja może być następnie używana mniej więcej w taki sam sposób, jak pożądany powyżej, używając OPENROWSET
:
SELECT
*
INTO
#tmpSortedBooks
FROM
BooksByPrimaryAuthor('Tolkien')
W przypadku, gdy naprawdę potrzebujesz procedury składowanej, możesz również opakować swoją funkcję w procedurę składowaną.