2009-08-08 12 views
31

मैं SQL Server 2008 एंटरप्राइज़ का उपयोग कर रहा हूं। मैं SQL सर्वर संग्रहीत प्रक्रिया के OUTPUT पैरामीटर सीख रहा हूँ। उदाहरण के लिए, संग्रहीत प्रक्रिया sp_add_jobschedule में एक OUTPUT पैरामीटर है जिसे schedule_id कहा जाता है।SQL सर्वर आउटपुट पैरामीटर समस्या

http://msdn.microsoft.com/en-us/library/ms366342.aspx

मेरे भ्रम की स्थिति है, लग रहा है आउटपुट पैरामीटर एक इनपुट मूल्य प्रदान किया जा सकता की तरह है और यह भी एक मान देता है, ऐसा लगता है कि दोनों इनपुट और आउटपुट पैरामीटर के व्यवहार है? क्या यह OUTPUT पैरामीटर के लिए कोई INPUT मान प्रदान नहीं करने की अनुमति है (इसे शुद्ध आउटपुट पैरामीटर व्यवहार की तरह दिखने के लिए)?

उत्तर

60

भ्रम एक हद तक उचित है - और Oracle जैसे अन्य आरडीबीएमएस संग्रहीत प्रक्रिया मानकों किस प्रकार IN का हो सकता है की क्या ज़रूरत है (इनपुट केवल), OUT (उत्पादन केवल) , या INOUT (दोनों तरीकों - "संदर्भ द्वारा पास करें" पैरामीटर के प्रकार)। के बाद से यह OUTPUT के रूप में पैरामीटर लेबल

एसक्यूएल सर्वर यहाँ थोड़ा लापरवाह है, लेकिन वास्तव में, इसका मतलब है INPUT/OUTPUT - यह मूल रूप से अर्थ केवल यह है कि संग्रहीत proc पैरामीटर में अपनी कॉल से एक मूल्य के लौटने का एक मौका है।

तो हाँ - हालांकि यह OUTPUT पैरामीटर कहा जाता है, यह एक INPUT/OUTPUT पैरामीटर का वास्तव में अधिक है, और उन IN, ओरेकल में INOUT, OUT तरह एसक्यूएल सर्वर में मौजूद नहीं है (T-SQL में)।

+0

धन्यवाद मार्क, "भ्रम की स्थिति एक हद तक उचित है - और Oracle जैसे अन्य आरडीबीएमएस करना प्रक्रिया पैरामीटर संग्रहीत किया है "- यही कारण है कि मैं उलझन में हूँ। मैं डीबी 2 से SQL सर्वर में माइग्रेट कर रहा हूं। बहुत सारी अवधारणाएं अलग-अलग हैं। :-( – George2

+1

एक और सवाल, हम एक वैकल्पिक पैरामीटर के रूप में OUTPUT पैरामीटर बना सकते हैं, यानी हम इसका इनपुट मान प्रदान नहीं कर सके, और इसे आउटपुट के रूप में उपयोग करें? – George2

+3

हां बेशक - आप INPUT मान प्रदान कर सकते हैं या इसे खाली छोड़ सकते हैं - यदि आप इसे अपनी संग्रहीत प्रक्रिया के अंदर उपयोग नहीं करते हैं, तो यह पूरी तरह से व्यर्थ है कि आप क्या पास करते हैं। यह आपके ऊपर है और आपके प्रक्रिया में आपके कोड को लिखना है या नहीं, चाहे आप पास किए गए मान को भी देखें या नहीं। "आउटपुट" खंड इसका मतलब है कि संग्रहित प्रक्रिया में इस पैरामीटर में एक मान वापस करने की क्षमता है - यह सब कुछ है। –

19

मैं आउटपुट पैरामीटर के साथ संग्रहीत प्रक्रिया को कैसे बनाया जाए, इस पर आपको संक्षिप्त उदाहरण दे सकता हूं।

CREATE PROCEDURE test_proc 

@intInput int, 
@intOutput int OUTPUT 

AS 
set @intOutput = @intInput + 1 

go 

और इस प्रक्रिया के कॉल करने के लिए और उसके बाद उत्पादन पैरामीटर का उपयोग निम्नलिखित के रूप में कार्य करें:

declare @intResult int 
exec test_proc 3 ,@intResult OUT 
select @intResult 

तुम देखो, यह है कि आप ouput चर पहले घोषित करना चाहिए। और संग्रहीत प्रक्रिया निष्पादित करने के बाद, आउटपुट मान आपके चर में होगा। आप अपने आउटपुट वैरिएबल पर कोई वैल्यू सेट कर सकते हैं, लेकिन संग्रहीत प्रक्रिया को निष्पादित करने के बाद इसमें सटीक प्रक्रिया की वापसी होगी (इससे कोई फर्क नहीं पड़ता कि आउटपुट वैरिएबल में क्या मूल्य था)।

उदाहरण के लिए:

declare @intResult int 
exec test_proc 3 ,@intResult OUT 
select @intResult 

यह 4. और वापस आ जाएगी:

declare @intResult int 
set @intResult = 8 
exec test_proc 3 ,@intResult OUT 
select @intResult 

इसके अलावा लौट 4.

+1

धन्यवाद, तो आउटपुट पैरामीटर दोनों इनपुट पैरामीटर और आउटपुट पैरामीटर व्यवहार है? – George2

+3

@ जॉर्ज 2: हां, OUTPUT पैरामीटर इनपुट और आउटपुट पैरामीटर दोनों के रूप में कार्य करता है। – shahkalpesh

2

सवाल यह है कि - क्यों उपलब्ध कराने की अनुमति नहीं देने के लिए करना चाहते हैं इनपुट? जो भी है किसी मतलब का नहीं है। इस सरल उदाहरण पर विचार करें:

CREATE PROCEDURE test (@param AS INT OUTPUT) AS 
BEGIN 
    SET @param = 100 
END 
GO 

DECLARE @i INT 
SET @i = 0 

EXECUTE test @i OUTPUT 
PRINT @i 

DROP PROCEDURE test 

यह प्रिंट

100 

देखें - कैसे तुम बाहर एक मूल्य पाने के लिए यदि आप पहले में एक चर डाल नहीं चाहिए?

+0

धन्यवाद टोमालक, मुझे यकीन नहीं है कि मैं इस तरह से आउटपुट पैरामीटर के साथ एक स्टोर प्रक्रिया डिजाइन कर सकता हूं। मैं आउटपुट पैरामीटर को वैकल्पिक इनपुट पैरामीटर दोनों के रूप में देख सकता हूं (क्योंकि आउटपुट पैरामीटर हमें किसी भी मान इनपुट नहीं करने की अनुमति देता है) और रिटर्न वैल्यू के रूप में? – George2

+1

मुझे यकीन नहीं है कि इसके बारे में क्या समझना मुश्किल है। :) वास्तविक समस्या क्या है? – Tomalak

+0

मैं एक विकल्प इनपुट पैरामीटर के रूप में OUTPUT पैरामीटर का उपयोग कर रहा हूं, मुझे यकीन नहीं है कि यह सही उपयोग है या नहीं? मैं इस तरह से उपयोग कर रहा हूं, स्टोर प्रक्रिया में, मैं जांचूंगा कि क्या कॉलर OUTPUT पैरामीटर के लिए कोई मान इनपुट करता है, यदि हां, तो मैं कुछ करूँगा, अगर OUTPUT पैरामीटर के लिए कोई इनपुट मान नहीं है, तो मैं कुछ और करूँगा। – George2

2

प्रोग्रामिंग भाषाओं में संदर्भ के अनुसार आउटपुट पैरामीटर के बारे में सोचें, यह वही है। सबसे अच्छा उदाहरण मैं अभी सोच सकता हूं कि त्रुटि कोड लौटा रहा है। आप कुछ सम्मिलित करना चाहते हैं ... यदि आप एसपी से रिटर्न कोड का चयन करते हैं तो आपको इसे अपने कोड में वापस ले जाना होगा, आपके पास OUTPUT पैरामीटर नहीं है, यह आपके पैरामीटर में पहले से ही होगा (मेरा मतलब है सी # कमांड, PHP का उपयोग करना init संग्रहीत proc विधियों, या कुछ और तो निर्माण तार)

+0

धन्यवाद स्वेतलियो, ऐसा लगता है कि इसमें INPUT और OUTPUT पैरामीटर दोनों का व्यवहार है? क्या यह OUTPUT पैरामीटर के लिए कोई INPUT मान प्रदान नहीं करने की अनुमति है (इसे शुद्ध आउटपुट पैरामीटर व्यवहार की तरह दिखने के लिए)? – George2

+2

@ जॉर्ज 2: "क्या यह OUTPUT पैरामीटर के लिए कोई INPUT मान प्रदान नहीं करने की अनुमति है (इसे शुद्ध आउटपुट पैरामीटर व्यवहार की तरह दिखने के लिए)" - क्या सर्गेई ने कोड 1 में उदाहरण के लिए क्या दिखाया है? – shahkalpesh

+0

आपका मतलब यह है? घोषित @intResult int कार्यकारी test_proc 3, @ intResult बाहर @intResult – George2

5

हां, आप मूल्यों को पार करने और पुनर्प्राप्त करने के लिए एक OUTPUT पैरामीटर का उपयोग कर सकते हैं (हालांकि मैं इस समय ऐसा करने का एक अच्छा कारण नहीं सोच सकता)।

-- The stored procedure 
CREATE PROCEDURE OutParamExample 
    @pNum int OUTPUT 
AS 
BEGIN 
    select @pNum 
    set @pNum = @pNum + 5 
END 
GO 

-- use a local variable to retrieve your output param value 
declare @TheNumber int 
set @TheNumber = 10 

print @TheNumber 
exec OutParamExample @TheNumber OUTPUT 
print @TheNumber 

परिणाम इस तरह दिखेगा:

10 

----------- 
10 

(1 row(s) affected) 

15 

संपादित करें:

यहाँ एक तुच्छ उदाहरण है कि इस दर्शाता है ठीक है, मुझे लगता है कि मैं दूसरे में एक "नहीं" याद किया अनुच्छेद और आपके द्वारा पूछे गए प्रश्न का उत्तर नहीं दिया हो सकता है। यदि आप सख्त आउटपुट पैरामीटर (उदाहरण के लिए रिटर्न कोड की तरह कुछ) चाहते हैं, तो आपको आउटपुट पैरामीटर के रूप में पारित स्थानीय चर में वैल्यू प्रदान करने की ज़रूरत नहीं है, लेकिन आपको अभी भी उस स्थानीय चर को घोषित करना होगा ताकि आप प्रक्रिया के दायरे के बाहर लौटे हुए मूल्य तक पहुंचने का एक तरीका होगा।

उदाहरण के लिए:

declare @LocalNumber int 
-- I don't have to assign a value to @LocalNumber to pass it as a parameter 
exex OutParamExample @LocalNumber OUTPUT 
-- (assume SP has been altered to assign some reasonable value) 

-- but I do have to declare it as a local variable so I can get to 
-- the return value after the stored procedure has been called 
print @LocalNumber 
3

क्या दूसरों के ऊपर कहा है करने के लिए आगे जोड़ा जा रहा है, आउटपुट पैरामीटर इनपुट के साथ-साथ आउटपुट के रूप में कार्य कर सकते हैं। लेकिन, यह संग्रहीत प्रक्रिया पर निर्भर करता है कि इसे पास किए गए मान का उपयोग किया जाए।

यदि संग्रहित प्रक्रियाएं OUTPUT पैरामीटर (जो आमतौर पर इसे चाहिए) के लिए पारित मान को अनदेखा करती है, तो INPUT मान को वैसे भी अनदेखा किया जाता है।

सेर्गेई के कोड का उपयोग करना, मैं मूल्य उपयोगकर्ता @intOutput के लिए पारित कर दिया (अगर मैं करने की जरूरत है), कि आउटपुट पैरामीटर का उद्देश्य धरा का उपयोग कर सकते

create PROCEDURE test_proc 

@intInput int, 
@intOutput int OUTPUT 

AS 
set @intOutput = @intOutput + 1 

go 

लेकिन।
एक अलग दृश्य देने के लिए, सी # कंपाइलर आपको असाइनमेंट द्वारा आउटपुट पैरामीटर के मान को ओवरराइट करने के लिए मजबूर करता है (आउटपुट पैरामीटर का उपयोग किए बिना)।

उदा। मैं इसे सी # में नहीं कर सकता। यहाँ इसे केवल बाहर पैरामीटर में कार्य करता है (यानी इस समारोह को भेजे गए मान उपयोगकर्ता की अनदेखी)

static void dosomething(out int i) 
{ 
    //i = 0; 
    i = i + 1; 
} 
1

एक अतिरिक्त टिप्पणी मूल प्रश्न के भाग के बारे में:

"यह किसी भी इनपुट प्रदान करने के लिए नहीं की अनुमति दी है OUTPUT पैरामीटर के लिए मान (..)? "

SQL सर्वर में एक OUTPUT पैरामीटर के लिए एक डिफ़ॉल्ट मान निर्दिष्ट करना संभव है (जैसा कि अन्य ने वास्तव में इंगित किया है)। निम्न उदाहरण पर विचार करें जिसमें आप एक स्पष्ट मान निर्दिष्ट कर सकते हैं या फ़ंक्शन स्वयं आईडी उत्पन्न कर सकते हैं।

CREATE PROCEDURE test (@id uniqueidentifier = NULL OUTPUT) AS 
BEGIN 
    IF @id IS NULL SET @id = NEWID() 
    -- INSERT INTO xyz (...) VALUES (@id, ...) 
    PRINT 'Insert with id: ' + CAST (@id as nvarchar(36)) 
END 
GO 

DECLARE @insertedId uniqueidentifier 
EXECUTE test '00000000-0000-0000-0000-000000000000' 
EXECUTE test @insertedId OUTPUT 
PRINT @insertedId 

DROP PROCEDURE test 

यह प्रिंट

Insert with id: 00000000-0000-0000-0000-000000000000 
Insert with id: 67AE3D27-8EAB-4301-B384-30EEA1488440 
67AE3D27-8EAB-4301-B384-30EEA1488440