Dalam beberapa kasus dengan SQL Server, mungkin ada contoh di mana Anda ingin mengambil data yang dihasilkan dari prosedur tersimpan dan memasukkannya ke dalam tabel sementara untuk digunakan dalam kueri lain. Menentukan cara menyelesaikan tugas ini bisa jadi agak sulit, jadi kami akan menjelaskan secara singkat beberapa opsi, tergantung pada kebutuhan spesifik Anda dan konfigurasi database.
Sebelum kita memeriksa metode spesifik, mari buat contoh prosedur. Meskipun tidak terlalu berguna, mari buat BooksByPrimaryAuthor
prosedur, yang menerima @PrimaryAuthor
parameter dan mengambil catatan dari books
kami tabel di mana @PrimaryAuthor
pertandingan. Pernyataan pembuatan prosedur mungkin terlihat seperti ini:
CREATE PROC BooksByPrimaryAuthor
@PrimaryAuthor nvarchar(100)
AS
BEGIN
SELECT
*
FROM
books
WHERE
primary_author = @PrimaryAuthor;
END
GO
Idealnya, yang ingin kita lakukan adalah seperti ini, di mana kita SELECT
data yang dihasilkan dari prosedur kami dan masukkan ke dalam tabel sementara:
SELECT
*
INTO
#tmpSortedBooks
FROM
EXEC BooksByPrimaryAuthor 'Tolkien'
Masalahnya adalah sintaks di atas tidak tepat dan tidak akan berfungsi . Kami membutuhkan metode baru.
Menggunakan Pernyataan OPENROWSET
Salah satu kemungkinan adalah dengan menggunakan OPENROWSET
pernyataan, yang memungkinkan Anda mengakses data jarak jauh dari sumber OLE DB dan dapat dieksekusi langsung dari dalam pernyataan SQL lain. OPENROWSET
adalah koneksi satu kali dan metode pengambilan data, sehingga tidak boleh digunakan untuk koneksi yang sering (dalam hal ini server penautan lebih disukai).
OPENROWSET
bisa menjadi target INSERT
any , DELETE
, atau UPDATE
pernyataan, yang membuatnya ideal untuk tujuan kami "mengeksekusi" prosedur tersimpan kami untuk kami dan mengekstrak data itu kembali ke tabel sementara kami yang menunggu.
Sebelum menggunakan OPENROWSET
, mungkin perlu memodifikasi beberapa opsi konfigurasi, khususnya dengan mengizinkan akses ad hoc. Ini dapat dikonfigurasi menggunakan pernyataan berikut:
sp_configure 'Show Advanced Options', 1
GO
RECONFIGURE
GO
sp_configure 'Ad Hoc Distributed Queries', 1
GO
RECONFIGURE
GO
Sekarang kita dapat menggunakan OPENROWSET
, yang memiliki sintaks tertentu yang harus dipatuhi:
OPENROWSET(
<PROVIDER_NAME>,
<DATA_SOURCE>,
<OPTIONS>
)
Dengan demikian, kami dapat menjalankan prosedur tersimpan kami melalui OPENROWSET
dan berikan ke tabel sementara kami seperti ini:
SELECT
*
INTO
#tmpSortedBooks
FROM
OPENROWSET(
'SQLNCLI',
'Server=(local)\SQL2008;Trusted_Connection=yes;',
'EXEC BooksByPrimaryAuthor Tolkien'
)
Anda mungkin perlu mengubah PROVIDER_NAME
dan DATA_SOURCE
nilai untuk tujuan Anda sendiri.
Menggunakan Fungsi Buatan Pengguna
Ada beberapa kelemahan pada OPENROWSET
metode, yaitu memerlukan izin/konfigurasi ad hoc seperti yang kita lihat di atas, dan juga OPENROWSET
hanya mampu mengembalikan satu set hasil (jika beberapa set disediakan, hanya set hasil pertama yang dikembalikan).
Oleh karena itu, metode lain untuk melakukan tugas ini adalah mengganti prosedur tersimpan secara efektif dengan fungsi yang ditentukan pengguna.
Dari contoh kita, itu akan terlihat seperti ini:
CREATE FUNCTION BooksByPrimaryAuthor
(
@PrimaryAuthor nvarchar(100)
)
RETURNS TABLE
AS
RETURN
SELECT
*
FROM
books
WHERE
primary_author = @PrimaryAuthor;
GO
Fungsi ini kemudian dapat digunakan secara kasar dengan cara yang sama seperti yang diinginkan di atas menggunakan OPENROWSET
:
SELECT
*
INTO
#tmpSortedBooks
FROM
BooksByPrimaryAuthor('Tolkien')
Jika Anda benar-benar membutuhkan prosedur tersimpan, Anda juga dapat membungkus fungsi Anda dalam prosedur tersimpan.