2009-10-05 13 views
5

मैं जानना चाहता हूं कि वैसे भी मैं अपने संग्रहित प्रक्रिया पैरामीटर को वैकल्पिक के रूप में सेट कर सकता हूं।एसक्यूएल सर्वर: संग्रहीत प्रक्रिया में वैकल्पिक चर

IF @thing_id <> '' 
BEGIN 
SET @sFiltre = @sFiltre + ' AND OPERES.OPE_THING = ' + CONVERT(VARCHAR,@thing_id) 
END 

उत्तर

7

संग्रहीत प्रक्रिया पैरामीटर के लिए डिफ़ॉल्ट मान प्रदान करना इसे वैकल्पिक बना देगा।

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

बनाएं PROC [EDURE] [मालिक। ]
प्रक्रिया_नाम [; संख्या]
[{@parameter DATA_TYPE}
[VARYING] [= डिफ़ॉल्ट] [आउटपुट]
] [... n]

डिफ़ॉल्ट

पैरामीटर के लिए एक डिफ़ॉल्ट मूल्य है। यदि कोई डिफ़ॉल्ट परिभाषित किया गया है, तो प्रक्रिया को उस पैरामीटर के लिए मान निर्दिष्ट किए बिना निष्पादित किया जा सकता है। डिफ़ॉल्ट स्थिर होना चाहिए या यह पूर्ण हो सकता है। यदि यह प्रक्रिया LIKE कीवर्ड के साथ पैरामीटर का उपयोग करती है तो इसमें वाइल्डकार्ड वर्ण (%, _, [], और [^]) शामिल हो सकते हैं।

कृपया देखें - http://msdn.microsoft.com/en-us/library/aa258259%28SQL.80%29.aspx

3

हां। सूची पैरामीटर सूची के अंत में "वैकल्पिक" मानकों और उन्हें एक डिफ़ॉल्ट मान (आमतौर पर शून्य) दे:

CREATE PROCEDURE MyProcedure 
    @param1 int, 
    @param2 varchar(200), 
    @thing_id int = NULL 
AS 

    If @thing_id IS NULL Begin 
     /* ... */ 
    End 

END 
+0

@Joel: यह आवश्यक वैकल्पिक पैरामीटर के लिए, अंत में है? मुझे लगता है, उपयोगिता के दृष्टिकोण से इसे करना बेहतर है। क्या वह सही है? – shahkalpesh

+0

नहीं, लेकिन यह निश्चित रूप से एक सर्वोत्तम अभ्यास है। –

14

जब आप संग्रहीत प्रक्रिया बनाने के लिए, यह इस

Create Proc MyProc 
@Param1 VarChar (20), 
@Param2 VarChar (20) = NULL 
AS 

-- Your code here 

GO 

param1 की तरह बनाने के है अनिवार्य

pARAM2 हाँ आप कर सकते हैं वैकल्पिक

+0

धन्यवाद राज। यह आसान था –

0

एसक्यूएल इंजेक्शन खुशी है कि कोड लाएगा एक तरफ की स्थापना करता है। आप मापदंडों

CREATE PROCEDURE DoStuff @param1 varchar(20) = null 

लिए एक डिफ़ॉल्ट मान सेट कर सकते हैं तो फिर संग्रहीत प्रक्रिया

IF @param1 IS NOT NULL 
BEGIN 
    ... Do stuff 
END 

अंदर आप डिफ़ॉल्ट मान सेट कर सकते हैं आप की तरह कुछ भी किया जाना है।

0
CREATE PROCEDURE SQL_INJECTION(
@MandatoryA int, 
@MandatoryB varchar(50), 
@MandatoryC datetime, 
@OptionalA varchar(50) = NULL 
) 
AS 

-- PUT YOUR DYNAMIC SQL HERE 

GO 

कॉल करने के लिए

EXEC dbo.SQL_INJECTION @MandatoryA = 1, @MandatoryB = 'test', @MandatoryC = '2009-10-05', @OptionalA = DEFAULT 

Note1: गतिशील एसक्यूएल = SQL इंजेक्शन

+0

"गतिशील एसक्यूएल = एसक्यूएल इंजेक्शन" जरूरी नहीं है। यह इस बात पर निर्भर करता है कि क्या आप अपनी गतिशील एसक्यूएल स्ट्रिंग बनाने के लिए उपयोगकर्ता द्वारा प्रदत्त मानों का उपयोग करते हैं या नहीं। आप आसानी से संग्रहीत प्रक्रिया के भीतर तर्क पर आधारित एक गतिशील एसक्यूएल स्ट्रिंग बना सकते हैं, फिर उपयोगकर्ता द्वारा प्रदत्त मानों को पैरामीटर के माध्यम से गतिशील कथन में पास कर सकते हैं।ओपी का कोड एसक्यूएल इंजेक्शन के लिए खुला होगा, लेकिन सभी गतिशील एसक्यूएल नहीं है। – nicko

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