SQL सर्वर के साथ कुछ मामलों में, एक उदाहरण हो सकता है जहाँ आप परिणामी डेटा को संग्रहीत कार्यविधि से लेना चाहते हैं और इसे किसी अन्य क्वेरी में उपयोग के लिए एक अस्थायी तालिका में सम्मिलित करना चाहते हैं। यह निर्धारित करना कि इस कार्य को कैसे पूरा किया जाए, कुछ मुश्किल हो सकता है, इसलिए हम आपकी विशिष्ट आवश्यकताओं और डेटाबेस कॉन्फ़िगरेशन के आधार पर कुछ विकल्पों की संक्षेप में रूपरेखा तैयार करेंगे।
विशिष्ट विधियों की जांच करने से पहले, आइए एक उदाहरण प्रक्रिया बनाएं। जबकि विशेष रूप से उपयोगी नहीं है, आइए 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
. का उपयोग करने से पहले , कुछ कॉन्फ़िगरेशन विकल्पों को संशोधित करना आवश्यक हो सकता है, विशेष रूप से तदर्थ पहुंच की अनुमति देकर। इसे निम्नलिखित कथनों का उपयोग करके कॉन्फ़िगर किया जा सकता है:
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
. में कुछ कमियां हैं विधि, अर्थात् इसके लिए तदर्थ अनुमति/कॉन्फ़िगरेशन की आवश्यकता है जैसा कि हमने ऊपर देखा, और 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')
इस घटना में कि आपको वास्तव में एक संग्रहीत कार्यविधि की आवश्यकता है, आप अपने फ़ंक्शन को एक संग्रहीत कार्यविधि में भी लपेट सकते हैं।