В някои случаи със 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')
В случай, че наистина имате нужда от съхранена процедура, можете също да обвиете функцията си в съхранена процедура.