2011-10-21 11 views
13

पर विचार करें:टी-एसक्यूएल में कॉल और एक्सईसी के बीच क्या अंतर है?

CREATE PROCEDURE LowerCityDiscounts @city VARCHAR(45), @decrease DECIMAL(10,2) AS 
BEGIN 
    BEGIN TRANSACTION; 
    UPDATE Customers SET discnt = discnt - @decrease 
    WHERE Customers.city = @city; 

    UPDATE Customers SET discnt = 0 
    WHERE Customers.city = @city AND discnt < 0 
    COMMIT; 
END; 

मैं के साथ इस प्रक्रिया को फोन करने की कोशिश की:

CALL LowerCityDiscounts 'Cleveland', 5; 

लेकिन यह केवल

Msg 102, Level 15, State 1, Line 1 
Incorrect syntax near 'Cleveland'. 

फिर भी पैदा करता है, अगर मैं

EXEC LowerCityDiscounts 'Cleveland', 5; 
लिए चीजों को बदलना

सब कुछ ठीक काम करता है। यह the documentation के बावजूद यह बताते हुए कि call सही वाक्यविन्यास है।

EXEC क्यों काम करता है जब CALL नहीं करता है?

+0

लिंक किए गए दस्तावेज ओडीबीसी चालक से संबंधित हैं, यानी 'कॉल' एक ओडीबीसी निर्माण है। आप ओडीबीसी का उपयोग कर रहे हैं? –

+0

एक एक tsql कीवर्ड है, दूसरा मूल रूप से – Peter

+0

@KierenJohnstone नहीं है: ठीक है, मैं ऐप के अंदर ओडीबीसी का उपयोग कर रहा हूं, लेकिन मैं SQL सर्वर प्रबंधन स्टूडियो के अंदर चीजों का परीक्षण कर रहा हूं। –

उत्तर

13

यूप .. CALL एक ओडीबीसी ड्राइवर से उपयोग/निर्माण वाक्यविन्यास है, जैसा कि आपके दस्तावेज़ इंगित करता है।

टी-एसक्यूएल दस्तावेज में CALL, केवल EXEC पर कोई संदर्भ नहीं है।

यह काम नहीं करता है क्योंकि यह टी-एसक्यूएल नहीं है।

4

टी-एसक्यूएल भाषा ओडीबीसी भागने के दृश्यों को पहचान नहीं पाती है; EXEC संग्रहित प्रक्रिया को कॉल करने के लिए उपलब्ध एकमात्र कमांड है। ओडीबीसी एस्केप अनुक्रमों को क्लाइंट-साइड लाइब्रेरीज़ (जैसे ओडीबीसी, ओएलई डीबी, एडीओ, एडीओ.नेट) द्वारा व्याख्या किया जाता है और निष्पादन से पहले फ्लाई पर वास्तविक टी-एसक्यूएल सिंटैक्स में अनुवाद किया जाता है।

अंतिम परिणाम यह है कि आप CALL का उपयोग कर क्लाइंट से अपनी शीर्ष-स्तरीय संग्रहीत प्रक्रिया को कॉल कर सकते हैं, लेकिन यदि वह प्रक्रिया दूसरों को कॉल करती है, तो उसे EXEC का उपयोग करना होगा।

वही सिद्धांत तिथि/समय शाब्दिक भागने के दृश्यों के लिए लागू होता है।

+0

'{कॉल [फू]} 'ओडीबीसी ड्राइवर द्वारा' EXEC' के रूप में पुनः लिखा जाता है 'एसक्यूएल सर्वर इसे देखता है । यद्यपि दिनांक/समय शाब्दिक भागने के दृश्यों के लिए यह सच नहीं लगता है।जहां तक ​​मैं निर्धारित कर सकता हूं, SQL सर्वर उन्हें मूल रूप से समझता है। –

+0

@ मार्टिन: इसके लिए धन्यवाद, हर दिन कुछ नया सीखें। :-) –

2

मैं किसी समस्या (डेटाबेस माइग्रेट करते समय) में चला गया कि MSSQL संग्रहीत प्रक्रिया में CALL कथन स्वीकार करेगा - SQL प्रबंधन स्टूडियो शिकायत करता है लेकिन क्वेरी स्वयं सफलतापूर्वक निष्पादित की जाती है।

तो इस तरह के एक बयान पर अमल करता है:

create procedure spwho 
as begin 
    call sp_who2 
end 
go 

exec spwho 

दुर्भाग्य से भले ही प्रक्रिया बनाई गई है, यह किसी भी परिणाम का उत्पादन नहीं करता (लेकिन न तो यह किसी भी त्रुटि या चेतावनी का उत्पादन करता है)।

तो इस तरह के मामलों में CALL कथन MSSQL में त्रुटियों का उत्पादन नहीं करेगा लेकिन वैसे भी का उपयोग कभी नहीं किया जाना चाहिए क्योंकि यह काम नहीं करता है।

संबंधित मुद्दे