Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да вмъкнете резултатите от съхранена процедура във временна таблица в SQL Server

В някои случаи със SQL Server може да има екземпляр, в който искате да вземете получените данни от съхранена процедура и да ги вмъкнете във временна таблица за използване в друга заявка. Определянето на това как да се изпълни тази задача може да бъде малко трудно, така че ще очертаем накратко няколко опции, в зависимост от вашите специфични нужди и конфигурация на базата данни.

Преди да разгледаме конкретните методи, нека създадем примерна процедура. Въпреки че не е особено полезно, нека създадем BooksByPrimaryAuthor процедура, която приема @PrimaryAuthor параметър и грабва записи от нашите books таблица, където @PrimaryAuthor мачове. Изявлението за генериране на процедурата може да изглежда така:

CREATE PROC BooksByPrimaryAuthor
  @PrimaryAuthor nvarchar(100)
AS
BEGIN
  SELECT
    *
  FROM
    books
  WHERE
    primary_author = @PrimaryAuthor;
END
GO

В идеалния случай това, което бихме искали да направим, е нещо подобно, където SELECT получените данни от нашата процедура и ги вмъкнете във временна таблица:

SELECT
  *
INTO
  #tmpSortedBooks
FROM
  EXEC BooksByPrimaryAuthor 'Tolkien'

Проблемът е горният синтаксис е неправилен и няма да работи . Нуждаем се от нов метод.

Използване на оператора OPENROWSET

Една от възможностите е да използвате OPENROWSET оператор, който ви позволява да получите достъп до отдалечени данни от източник на OLE DB и може да се изпълни директно от друг SQL израз. OPENROWSET е еднократна връзка и метод за извличане на данни, така че не трябва да се използва за чести връзки (в този случай свързването на сървъри е за предпочитане).

OPENROWSET може да бъде цел на всеки INSERT , DELETE , или UPDATE изявление, което го прави идеален за нашите цели да „изпълним“ нашата съхранена процедура вместо нас и да извлечем тези данни обратно в нашата чакаща временна таблица.

Преди да използвате OPENROWSET , може да се наложи да промените някои опции за конфигурация, по-специално чрез разрешаване на ad hoc достъп. Това може да се конфигурира с помощта на следните изрази:

sp_configure 'Show Advanced Options', 1
GO
RECONFIGURE
GO
sp_configure 'Ad Hoc Distributed Queries', 1
GO
RECONFIGURE
GO

Сега можем да използваме OPENROWSET , който има определен синтаксис, който трябва да се спазва:

OPENROWSET(
  <PROVIDER_NAME>,
  <DATA_SOURCE>,
  <OPTIONS>
)

По този начин можем да изпълним нашата съхранена процедура чрез OPENROWSET и го предайте на нашата временна таблица така:

SELECT
  *
INTO
  #tmpSortedBooks
FROM
  OPENROWSET(
    'SQLNCLI',
    'Server=(local)\SQL2008;Trusted_Connection=yes;',
    'EXEC BooksByPrimaryAuthor Tolkien'
)

Може да се наложи да промените PROVIDER_NAME и DATA_SOURCE стойности за вашите собствени цели.

Използване на функция, дефинирана от потребителя

Има няколко недостатъка на OPENROWSET метод, а именно, че изисква ad hoc разрешения/конфигурация, както видяхме по-горе, както и OPENROWSET може да връща само единичен набор от резултати (ако са предоставени няколко набора, се връща само първият набор от резултати).

Следователно, друг метод за изпълнение на тази задача е ефективно заместване на съхранената процедура с дефинирана от потребителя функция.

От нашия пример това би изглеждало така:

CREATE FUNCTION BooksByPrimaryAuthor
(
  @PrimaryAuthor nvarchar(100)
)
RETURNS TABLE
AS
RETURN
  SELECT
    *
  FROM
    books
  WHERE
    primary_author = @PrimaryAuthor;
GO

След това тази функция може да се използва приблизително по същия начин, както желаете по-горе, като се използва OPENROWSET :

SELECT
  *
INTO
  #tmpSortedBooks
FROM
  BooksByPrimaryAuthor('Tolkien')

В случай, че наистина имате нужда от съхранена процедура, можете също да обвиете функцията си в съхранена процедура.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SCOPE_IDENTITY() за GUID?

  2. Проверете за неуспешен имейл в SQL Server (T-SQL)

  3. Представяме първата в света SaaS платформа за предоставяне на задълбочена диагностика за хибридни SQL сървърни среди

  4. Вътрешни елементи за репликация на транзакции на SQL Server

  5. Ръководство за начинаещи за SQL таблици