2013-01-24 34 views
31
SELECT col1, 
     col2, 
     col3, 

EXEC GetAIntFromStoredProc(T.col1) AS col4 
    FROM Tbl AS T 
    WHERE (col2 = @parm) 

SQL सर्वर 2008 में इस SQL ​​क्वेरी को कैसे लिखें?एक चयनित क्वेरी

+5

आपको फ़ंक्शंस देखना चाहिए, आप किसी संग्रहित प्रक्रिया को किसी चयनित क्वेरी से कॉल नहीं कर सकते हैं। – twoleggedhorse

+1

col1, col2, col3, EXEC GetAIntFromStoredProc (t.col1) को col4 के रूप में टीबीआर से टी के रूप में चुनें जहां (col2 = @parm) EX1 MyStoredProc 'param1', 'param2' से col1, col2 का चयन नहीं करता है। यह एक डुप्लिकेट नहीं है, संपादन करने का प्रयास किया गया लेकिन अस्वीकार कर दिया गया था, इस पोस्ट का जवाब सही है – DooMMcQ

उत्तर

31

धन्यवाद:

यहाँ जवाब यह मैं कर सकते हैं की तुलना में बेहतर समझा जाएगा।

यहां समाधान है।

  1. पहले हम एक समारोह बनाई

    CREATE FUNCTION GetAIntFromStoredProc(@parm Nvarchar(50)) RETURNS INTEGER 
    
    AS 
    BEGIN 
        DECLARE @id INTEGER 
    
        set @id= (select TOP(1) id From tbl where [email protected]) 
    
        RETURN @id 
    END 
    
  2. तो हम चयन क्वेरी

    Select col1, col2, col3, 
    GetAIntFromStoredProc(T.col1) As col4 
    From Tbl as T 
    Where [email protected] 
    
+36

लेकिन अब संग्रहीत प्रक्रिया नहीं है ... – levi

+10

बिल्कुल। सही जवाब "संभव नहीं" होना चाहिए था। – Tundey

+0

यह प्रक्रियाओं के बारे में वर्णित शाब्दिक प्रश्न का उत्तर नहीं है। यह बड़ी सीमाओं के साथ एक वैकल्पिक समाधान है। मेरा वास्तविक जवाब देखें। – BuvinJ

4

जब तक आप अपनी संग्रहीत प्रक्रिया में कोई INSERT या UPDATE स्टेटमेंट नहीं कर रहे हैं, तो आप शायद इसे एक फ़ंक्शन बनाना चाहते हैं।

संग्रहीत प्रक्रिया बाहरी कार्यक्रम, या एक समय अंतराल पर निष्पादित करने के लिए हैं। @twoleggedhorse

Function vs. Stored Procedure in SQL Server

+0

एक संग्रहीत प्रक्रिया का उपयोग "बाहरी प्रोग्राम द्वारा निष्पादित करने के लिए, या एक समय अंतराल पर" किया जा सकता है।, लेकिन वे किसी भी तरह से सीमित नहीं हैं वह, या केवल उन उद्देश्यों के लिए इरादा है। आंकड़ों में हेरफेर के लिए मांग संदर्भ पर अकेले स्टैंड में चलाने के लिए लिपियों को लिखा जाता है। – BuvinJ

10

कार्य-चुने पाश अंदर कॉल करने के लिए आसान कर रहे हैं, लेकिन वे डॉन ' आपको आवेषण, अद्यतन, हटाना इत्यादि चलाने की सुविधा नहीं है। वे केवल क्वेरी ऑपरेशंस के लिए उपयोगी हैं। डेटा को कुशल बनाने के लिए आपको एक संग्रहीत प्रक्रिया की आवश्यकता है।

तो, इस सवाल का असली जवाब यह है कि आपको "कर्सर" के माध्यम से एक चयन कथन के परिणामों के माध्यम से पुन: प्रयास करना होगा और उस लूप के भीतर से प्रक्रिया को कॉल करना होगा। यहाँ एक उदाहरण है:

DECLARE @myId int; 
DECLARE @myName nvarchar(60); 
DECLARE myCursor CURSOR FORWARD_ONLY FOR 
    SELECT Id, Name FROM SomeTable; 
OPEN myCursor; 
FETCH NEXT FROM myCursor INTO @myId, @myName; 
WHILE @@FETCH_STATUS = 0 BEGIN 
    EXECUTE dbo.myCustomProcedure @myId, @myName; 
    FETCH NEXT FROM myCursor INTO @myId, @myName; 
END; 
CLOSE myCursor; 
DEALLOCATE myCursor; 

ध्यान दें कि @@FETCH_STATUS एक मानक चर आप के लिए अद्यतन हो जाता है जो है। यहां शेष ऑब्जेक्ट नाम कस्टम हैं।