Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak wstawić wyniki procedury składowanej do tabeli tymczasowej w SQL Server

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ą.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server (TSQL) - Czy możliwe jest równoległe wykonywanie instrukcji EXEC?

  2. sp_executesql działa wolno z parametrami

  3. Łączenie ciągów SQL Server z wartością Null

  4. Konwertuj „smalldatetime” na „datetime” w SQL Server (przykłady T-SQL)

  5. SMALLDATETIMEFROMPARTS() Przykłady w SQL Server (T-SQL)