दिलचस्प पोस्ट
जब स्थिर सी ++ क्लास सदस्यों को आरंभ किया जाता है? विकर्ण पर मूल्य कैसे निर्दिष्ट करें? एमएस एक्सेल दुर्घटनाग्रस्त जब vba कोड रन पीडीएफ के शीर्ष पर <div> परत सी # "पैरामीटर मान्य नहीं है।" नया बिटमैप बना रहा है जो अधिक सही है: <h1> <a> … </a> </ h1> या <a> <h1> … </ h1> </a> एकाधिक शब्द खोज और नोटपैड में बदलें ++ UIView पर कस्टम राउंडिंग कोने पता करें कि रेडियो बटन JQuery के साथ चेक किया गया है या नहीं? पासवर्ड को हैशिंग और एन्क्रिप्ट करने में अंतर बाश में सिंगल और डबल कोट्स के बीच का अंतर Ajax अनुरोध का उपयोग कर फ़ाइल डाउनलोड करने का कोई तरीका क्यों नहीं है? JSF में सत्यापन कैसे करें, JSF में एक कस्टम वैलिएटर कैसे बनाएं मैं C ++ में सीएसवी फ़ाइलों को पढ़ और पार्स कैसे कर सकता हूं? पीडीओ कैसे सेट करता हूं, जब मैं कनेक्ट करता हूं, जब भी मैं कनेक्ट होता है, तो ज़ेडफ्रेमवर्क में

संग्रहीत कार्यविधि के परिणाम सेट से कॉलम का चयन करें

मेरे पास एक संग्रहीत प्रक्रिया है जो 80 कॉलम और 300 पंक्तियां देता है। मैं एक चुनिंदा लिखना चाहता हूं जो कि उन कॉलमों में से 2 हो। कुछ इस तरह

SELECT col1, col2 FROM EXEC MyStoredProc 'param1', 'param2' 

जब मैंने उपरोक्त सिंटैक्स का इस्तेमाल किया तो मुझे त्रुटि मिलती है:

"अमान्य कॉलम नाम"

मुझे पता है कि आसान समाधान संग्रहीत प्रक्रिया को बदलने के लिए होगा, लेकिन मैंने इसे नहीं लिखा, और मैं इसे बदल नहीं सकता।

क्या मैं क्या चाहता हूं?

  • मैं परिणाम डाल करने के लिए एक अस्थायी तालिका बना सकता था, लेकिन क्योंकि 80 कॉलम हैं इसलिए मुझे सिर्फ 2 कॉलम प्राप्त करने के लिए एक 80 कॉलम टेम्पल तालिका बनाने की आवश्यकता होगी। मैं लौटा सभी कॉलमों पर नज़र रखने से बचना चाहता था।

  • मैंने WITH SprocResults AS .... जैसा कि मार्क ने सुझाव दिया है, लेकिन मुझे 2 त्रुटियाँ मिलीं

    'EXEC' कीवर्ड के पास गलत सिंटैक्स
    आगे गलत वाक्य रचना ')'।

  • मैंने एक तालिका चर घोषित करने की कोशिश की और मुझे निम्नलिखित त्रुटि मिली

    सम्मिलित करें त्रुटि: कॉलम का नाम या आपूर्ति मूल्यों की संख्या तालिका परिभाषा से मेल नहीं खाती

  • अगर मैं कोशिश करता हूँ
    SELECT * FROM EXEC MyStoredProc 'param1', 'param2'
    मुझे त्रुटि मिलती है:

    कीवर्ड 'exec' के निकट गलत सिंटैक्स

वेब के समाधान से एकत्रित समाधान "संग्रहीत कार्यविधि के परिणाम सेट से कॉलम का चयन करें"

क्या आप क्वेरी को विभाजित कर सकते हैं? संग्रहित परिणाम को एक तालिका चर या एक अस्थायी तालिका में डालें। फिर, तालिका चर से 2 कॉलम चुनें

 Declare @tablevar table(col1,.. insert into @tablevar(col1,..) exec MyStoredProc 'param1', 'param2' SELECT col1, col2 FROM @tablevar 

आपकी समस्या को सुलझाने के लिए सभी विभिन्न तरीकों को समझाते हुए एक बहुत अच्छा दस्तावेज़ के लिए यहां एक लिंक है (हालांकि उनमें से बहुत से उपयोग नहीं किया जा सकता क्योंकि आप मौजूदा संग्रहीत कार्यविधि को संशोधित नहीं कर सकते हैं।)

संग्रहित प्रक्रियाओं के बीच डेटा को साझा कैसे करें

गुलजार का जवाब काम करेगा (यह ऊपर दिए गए लिंक में लिखा गया है), लेकिन यह लिखने में परेशानी होगी (आपको अपनेटेबलवार (कॉल 1, …) कथन में सभी 80 कॉलम नाम निर्दिष्ट करने होंगे। और भविष्य में अगर कोई स्तंभ स्कीमा में जोड़ा गया है या आउटपुट बदल दिया गया है, तो इसे आपके कोड में अपडेट करने की आवश्यकता होगी या यह त्रुटि होगी

 CREATE TABLE #Result ( ID int, Name varchar(500), Revenue money ) INSERT #Result EXEC RevenueByAdvertiser '1/1/10', '2/1/10' SELECT * FROM #Result ORDER BY Name DROP TABLE #Result 

स्रोत:
http://stevesmithblog.com/blog/select-from-a-stored-procedure/

यह मेरे लिए काम करता है: (यानी मुझे केवल 30 + के 2 कॉलम की आवश्यकता है sp_help_job द्वारा लौटाई गई)

 SELECT name, current_execution_status FROM OPENQUERY (MYSERVER, 'EXEC msdb.dbo.sp_help_job @job_name = ''My Job'', @job_aspect = ''JOB'''); 

इससे पहले यह काम करेगा, मुझे इसे चलाने की जरूरत थी:

 sp_serveroption 'MYSERVER', 'DATA ACCESS', TRUE; 

sys.servers तालिका अद्यतन करने के लिए …. (यानी ओपनएक्विरी में स्वयं-संदर्भ का प्रयोग करना डिफ़ॉल्ट रूप से अक्षम है।)

मेरी सरल आवश्यकता के लिए, मैं लेंस के उत्कृष्ट लिंक के OPENQUERY अनुभाग में वर्णित समस्याओं में से कोई भी नहीं गया।

रोसिनि, यदि आपको उन इनपुट पैरामीटर को गतिशील रूप से सेट करने की आवश्यकता है, तो फिर OPENQUERY का उपयोग थोड़ा और अधिक फीड हो जाता है:

 DECLARE @innerSql varchar(1000); DECLARE @outerSql varchar(1000); -- Set up the original stored proc definition. SET @innerSql = 'EXEC msdb.dbo.sp_help_job @job_name = '''+@param1+''', @job_aspect = N'''+@param2+'''' ; -- Handle quotes. SET @innerSql = REPLACE(@innerSql, '''', ''''''); -- Set up the OPENQUERY definition. SET @outerSql = 'SELECT name, current_execution_status FROM OPENQUERY (MYSERVER, ''' + @innerSql + ''');'; -- Execute. EXEC (@outerSql); 

मैं मौजूदा sys.servers स्वयं-संदर्भ सीधे, बनाम sp_addlinkedserver (जैसा कि लांस की लिंक में वर्णित है) का उपयोग करने के लिए एक डुप्लिकेट / उपनाम बनाने के लिए sp_serveroption का उपयोग करते हुए अंतर (यदि कोई है) के बारे में निश्चित नहीं हूँ।

नोट 1: मैं OPENROWSET पर OPENQUERY को पसंद करता हूं, यह देखते हुए कि OPENQUERY को proc के भीतर कनेक्शन-स्ट्रिंग परिभाषा की आवश्यकता नहीं है

नोट 2: यह सब कहने के बाद: आम तौर पर मैं केवल INSERT … EXEC का उपयोग करता हूँ 🙂 हाँ, यह 10 मिनट का अतिरिक्त टाइपिंग है, लेकिन अगर मैं इसकी मदद कर सकता हूं, तो मुझे ये पसंद नहीं है:
(ए) उद्धरण चिह्नों के भीतर उद्धरण चिह्नों के भीतर, और
(बी) सिस्टम तालिकाओं, और / या स्काइन्टी सेल्फ-रेफ्रेंसिंग लिंक्ड सर्वर सेटअप (यानी इनके लिए, मुझे अपने मामले को हमारे सभी-शक्तिशाली डीबीए के लिए अनुरोध करना होगा 🙂

हालांकि इस उदाहरण में, मैं INSERT का उपयोग नहीं कर सका … EXEC का निर्माण, क्योंकि sp_help_job पहले से ही एक का उपयोग कर रहा है ("एक INSERT EXEC वक्तव्य नेस्टेड नहीं किया जा सकता है।")

इसे प्राप्त करने के लिए, पहले आप नीचे एक #test_table बनाते हैं:

 create table #test_table( col1 int, col2 int, . . . col80 int ) 

अब निष्पादित प्रक्रिया और #test_table में डाल मूल्य:

 insert into #test_table EXEC MyStoredProc 'param1', 'param2' 

अब आप #test_table से मूल्य प्राप्त #test_table :

 select col1,col2....,col80 from #test_table 

ऐसा जानना उपयोगी हो सकता है कि ऐसा क्यों मुश्किल है एक संग्रहीत कार्यविधि केवल पाठ (प्रिंट 'टेक्स्ट') लौटा सकती है, या कई तालिकाओं को वापस कर सकती है, या कोई तालिकाओं को बिल्कुल भी नहीं लौटा सकता है

तो कुछ का SELECT * FROM (exec sp_tables) Table1 काम नहीं करेगा

(एसक्यूएल सर्वर मानते हुए)

टी-एसक्यूएल में एक संग्रहीत प्रक्रिया के परिणामों के साथ काम करने का एकमात्र तरीका INSERT INTO ... EXEC वाक्यविन्यास का उपयोग करना है यह आपको एक अस्थायी तालिका या एक तालिका चर को सम्मिलित करने का विकल्प देता है और वहां से आपको आवश्यक डेटा का चयन किया जाता है।

यदि आप अपनी संग्रहीत कार्यविधि को संशोधित करने में सक्षम हैं, तो आप आसानी से आवश्यक कॉलम परिभाषाएं एक पैरामीटर के रूप में रख सकते हैं और एक स्वत: निर्मित अस्थायी तालिका का उपयोग कर सकते हैं:

 CREATE PROCEDURE sp_GetDiffDataExample @columnsStatement NVARCHAR(MAX) -- required columns statement (eg "field1, field2") AS BEGIN DECLARE @query NVARCHAR(MAX) SET @query = N'SELECT ' + @columnsStatement + N' INTO ##TempTable FROM dbo.TestTable' EXEC sp_executeSql @query SELECT * FROM ##TempTable DROP TABLE ##TempTable END 

इस मामले में आपको एक अस्थायी तालिका मैन्युअल रूप से बनाने की आवश्यकता नहीं है – यह स्वचालित रूप से बनाया जाता है उम्मीद है की यह मदद करेगा।

एक त्वरित हैक एक नया पैरामीटर '@Column_Name' जोड़ना होगा और कॉलिंग फ़ंक्शन को कॉलम नाम को पुनः प्राप्त करने के लिए परिभाषित किया जाएगा। आपके sproc के बदले हिस्से में, यदि आपके पास / else बयान हैं और केवल निर्दिष्ट कॉलम लौटाएंगे, या रिक्त – सभी को वापस लौटेंगे।

 CREATE PROCEDURE [dbo].[MySproc] @Column_Name AS VARCHAR(50) AS BEGIN IF (@Column_Name = 'ColumnName1') BEGIN SELECT @ColumnItem1 as 'ColumnName1' END ELSE BEGIN SELECT @ColumnItem1 as 'ColumnName1', @ColumnItem2 as 'ColumnName2', @ColumnItem3 as 'ColumnName3' END END 

यदि आप यह डेटा के मैनुअल सत्यापन के लिए कर रहे हैं, तो आप इसे LINQPad के साथ कर सकते हैं।

लिनकपैड में डेटाबेस के लिए एक कनेक्शन बनाएँ, फिर निम्नलिखित के समान C # स्टेटमेंट बनाएं:

 DataTable table = MyStoredProc (param1, param2).Tables[0]; (from row in table.AsEnumerable() select new { Col1 = row.Field<string>("col1"), Col2 = row.Field<string>("col2"), }).Dump(); 

संदर्भ http://www.global-webnet.net/blogengine/post/2008/09/10/LINQPAD-Using-Stored-Procedures-Accessing-a-DataSet.aspx

SQL सर्वर के लिए, मुझे लगता है कि यह ठीक काम करता है:

एक अस्थायी तालिका (या स्थायी तालिका बनाएँ, वास्तव में कोई फर्क नहीं पड़ता), और संग्रहीत कार्यविधि के विरूद्ध विवरण में सम्मिलित करें। सपा की नतीजा सेट आपकी तालिका में कॉलम से मेल खाना चाहिए, अन्यथा आपको एक त्रुटि मिल जाएगी।

यहां एक उदाहरण है:

 DECLARE @temp TABLE (firstname NVARCHAR(30), lastname nvarchar(50)); INSERT INTO @temp EXEC dbo.GetPersonName @param1,@param2; -- assumption is that dbo.GetPersonName returns a table with firstname / lastname columns SELECT * FROM @temp; 

बस!

इसे इस्तेमाल करे

 use mydatabase create procedure sp_onetwothree as select 1 as '1', 2 as '2', 3 as '3' go SELECT a.[1], a.[2] FROM OPENROWSET('SQLOLEDB','myserver';'sa';'mysapass', 'exec mydatabase.dbo.sp_onetwothree') AS a GO 

चूंकि प्रश्न में उल्लेख किया गया है, संग्रहीत कार्यविधि को निष्पादित करने से पहले 80 स्तंभ अस्थायी तालिका को परिभाषित करना कठिन है।

तो इस के आस-पास का दूसरा तरीका संग्रहित प्रक्रिया परिणाम सेट के आधार पर तालिका को आबाद करना है।

 SELECT * INTO #temp FROM OPENROWSET('SQLNCLI', 'Server=localhost;Trusted_Connection=yes;' ,'EXEC MyStoredProc') 

यदि आपको कोई त्रुटि मिल रही है, तो आपको निम्नलिखित क्वेरी निष्पादित करके तदर्थ वितरित क्वेरी को सक्षम करना होगा।

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

एक कॉन्फ़िगरेशन विकल्प बदलने के लिए या RECONFIGURE स्टेटमेंट को चलाने के लिए दोनों पैरामीटर के साथ sp_configure को निष्पादित करने के लिए, आपको ALTER SETTINGS सर्वर-स्तरीय अनुमति प्रदान की जानी चाहिए

अब आप जेनरेटेड टेबल से अपने विशिष्ट कॉलम का चयन कर सकते हैं

 SELECT col1, col2 FROM #temp 

मैं मूल सपा को कट कर पेस्ट करूँगा और 2 को छोड़कर सभी स्तंभों को हटा देगा। या। मैं परिणाम को वापस लाता हूँ, उसे एक उचित व्यावसायिक ऑब्जेक्ट में मैप करें, फिर LINQ दो कॉलमों से बाहर।

ऐसा करने का सबसे आसान तरीका है कि आपको केवल एक बार यह करने की आवश्यकता है:

आयात और निर्यात विज़ार्ड में उत्कृष्टता के लिए निर्यात करें और फिर इसे एक तालिका में एक्सेल करें