आउटपुट मापदंडों और मूलभूत मूल्यों को एक साथ अच्छी तरह से काम नहीं है! यह एसक्यूएल 10.50.1617 (2008 आर 2) से है। इस निर्माण को विश्वास में रखने के लिए बेवकूफ मत बनो अपनी ओर से उस मूल्य पर SET
है (जैसे मेरे सहकर्मी ने किया)!
यह "खिलौना" एसपी OUTPUT
पैरामीटर मान पूछताछ करता है, भले ही यह डिफ़ॉल्ट मान या NULL
है।
CREATE PROCEDURE [dbo].[omgwtf] (@Qty INT, @QtyRetrieved INT = 0 OUTPUT)
AS
IF @QtyRetrieved = 0
BEGIN
print 'yay its zero'
END
IF @QtyRetrieved is null
BEGIN
print 'wtf its NULL'
END
RETURN
आप OUTPUT
के लिए एक गैर-आरंभिकृत मूल्य (अर्थात NULL
) में भेजते हैं, तो आप वास्तव में NULL
अंदर सपा, और नहीं 0
मिला है। समझ में आता है, उस पैरामीटर के लिए कुछ पारित हो गया।
declare @QR int
exec [dbo].[omgwtf] 1, @QR output
print '@QR=' + coalesce(convert(varchar, @QR),'NULL')
उत्पादन होता है:
wtf its NULL
@QR=NULL
हम फोन करने वाले से एक स्पष्ट SET
जोड़ देते हैं तो हम पाते हैं:
declare @QR int
set @QR = 999
exec [dbo].[omgwtf] 1, @QR output
print '@QR=' + coalesce(convert(varchar, @QR),'NULL')
और (unsurprising) उत्पादन:
@QR=999
फिर, समझ में आता है, एक पैरामीटर पारित किया गया है, और एसपी ने SET
पर कोई स्पष्ट कार्रवाई नहीं की है।
(जैसे आप क्या करना चाहिए रहे हैं) में सपा एक SET
की OUTPUT
पैरामीटर जोड़ें, लेकिन फोन करने वाले से कुछ भी निर्धारित नहीं करते हैं:
ALTER PROCEDURE [dbo].[omgwtf] (@Qty INT, @QtyRetrieved INT = 0 OUTPUT)
AS
IF @QtyRetrieved = 0
BEGIN
print 'yay its zero'
END
IF @QtyRetrieved is null
BEGIN
print 'wtf its NULL'
END
SET @QtyRetrieved = @Qty
RETURN
अब जब निष्पादित:
declare @QR int
exec [dbo].[omgwtf] 1234, @QR output
print '@QR=' + coalesce(convert(varchar, @QR),'NULL')
उत्पादन होता है:
wtf its NULL
@QR=1234
यह ०१२३६६५८५५४ के लिए "मानक" व्यवहार है एसपी मेंपैरामीटर हैंडलिंग।
अब नाटकीय मोड़ के लिए: के बाद से यह एक OUTPUT
के रूप में स्थापित है: करने के लिए "को सक्रिय" डिफ़ॉल्ट मान प्राप्त करने के लिए एक ही रास्ता है, सभी पर OUTPUT
पैरामीटर, जो IMHO थोड़ा समझ में आता है पारित नहीं है पैरामीटर, जिसका मतलब कुछ "महत्वपूर्ण" लौटाया जाना चाहिए जिसे एकत्र किया जाना चाहिए।
declare @QR int
exec [dbo].[omgwtf] 1
print '@QR=' + coalesce(convert(varchar, @QR),'NULL')
इस उत्पादन देता है:
yay its zero
@QR=NULL
लेकिन इस एस.पी. उत्पादन, शायद की कि सपा के साथ शुरू उद्देश्य पर कब्जा करने में विफल रहता है।
IMHO इस सुविधा संयोजन एक संदिग्ध निर्माण मैं एक कोड गंध (ओफ़्फ़ !!) पर विचार करेगा है
क्या की तरह अपने कोड दिखता है? यही है, कहीं आप इस बात पर शाखा बना रहे हैं कि कोई पता मौजूद है या नहीं। मुझे लगता है कि उस शाखा को देखने के बाद, मेरा सवाल संदिग्ध है, "जब भी कोई पता मौजूद नहीं है, * एक शाखा का उपयोग किए बिना * @ पता आईडी 'के लिए जो कुछ भी आप पास करते हैं, उसमें' न्यूल 'के साथ स्पोक को क्यों न बुलाएं?" – ruffin