2011-12-02 17 views
110

मैं इस स्क्रिप्ट है:T-SQL डिफ़ॉल्ट पैरामीटर के साथ समारोह

CREATE FUNCTION dbo.CheckIfSFExists(@param1 INT, @param2 BIT = 1) 
RETURNS BIT 
AS 
BEGIN 
    IF EXISTS (bla bla bla) 
     RETURN 1; 
    RETURN 0; 
END 
GO 

मैं इस तरह से एक प्रक्रिया में उपयोग करना चाहते हैं:

IF dbo.CheckIfSFExists(23) = 0 
    SET @retValue = 'bla bla bla'; 

लेकिन मैं त्रुटि मिलती है:

An insufficient number of arguments were supplied for the procedure or function dbo.CheckIfSFExists.

यह क्यों काम नहीं करता है?

उत्तर

166

आप इसे इस

SELECT dbo.CheckIfSFExists( 23, default) 

Technet से की तरह कॉल करनी होगी:

When a parameter of the function has a default value, the keyword DEFAULT must be specified when the function is called in order to retrieve the default value. This behavior is different from using parameters with default values in stored procedures in which omitting the parameter also implies the default value. An exception to this behavior is when invoking a scalar function by using the EXECUTE statement. When using EXECUTE, the DEFAULT keyword is not required.

+49

यह देखकर मैं निराश हूं। मुझे यहां 'डिफ़ॉल्ट' अवधारणा का लाभ नहीं मिल रहा है ... मुझे अब सभी जगहों पर जाना और बदलना होगा। – Lijo

+5

@ लिजो, आपको अभी भी प्रत्येक कॉल पर अपने कंक्रीट डिफ़ॉल्ट मान को डुप्लिकेट करने का लाभ नहीं मिलता है। –

14

उपयोगकर्ता परिभाषित कार्यों के साथ, आपको प्रत्येक पैरामीटर घोषित करना होगा, भले ही उनके पास डिफ़ॉल्ट मान हो।

निम्नलिखित सफलतापूर्वक अमल होगा:

IF dbo.CheckIfSFExists(23, default) = 0 
    SET @retValue = 'bla bla bla; 
24

आप इसे कॉल कर सकते हैं तीन तरीके - मानकों के साथ , DEFAULT के साथ और EXECUTE

के माध्यम से
SET NOCOUNT ON; 

DECLARE 
@Table SYSNAME = 'YourTable', 
@Schema SYSNAME = 'dbo', 
@Rows INT; 

SELECT dbo.TableRowCount(@Table, @Schema) 

SELECT dbo.TableRowCount(@Table, DEFAULT) 

EXECUTE @Rows = dbo.TableRowCount @Table 

SELECT @Rows 
0

इस समस्या के आसपास एक तरीका आउटपुट पैरामीटर के साथ संग्रहीत प्रक्रियाओं का उपयोग करना है।

कार्यकारी sp_mysprocname @returnvalue उत्पादन, @firstparam = 1, @ secondparam = 2

मूल्यों आप चूक संग्रहीत प्रक्रिया अपने आप में स्थापित करने के लिए डिफ़ॉल्ट में उत्तीर्ण नहीं होते हैं। और आप अपने आउटपुट वैरिएबल से परिणाम प्राप्त कर सकते हैं।

+0

आपके फ़ंक्शन को संग्रहीत प्रक्रिया में बदलना सामान्य रूप से एक अच्छा समाधान नहीं है, क्योंकि एक संग्रहित प्रक्रिया को किसी क्वेरी के भीतर से नहीं बुलाया जा सकता है, लेकिन एक फ़ंक्शन कर सकता है। – Blade

+0

सच है, हालांकि कोड के सभी ब्लॉक को किसी क्वेरी के भीतर से कॉल करने की आवश्यकता नहीं है। यह दिखाया गया है कि एसक्यूएल में कार्यों के लिए डिफ़ॉल्ट मानों को संभालने का एक अच्छा तरीका नहीं है (डिफ़ॉल्ट कीवर्ड का उपयोग करके मूल्य जोड़ने के रूप में लगभग उतना ही काम है)। यह एक अच्छा सामान्य समाधान नहीं है, लेकिन यह कुछ उपयोग मामलों में बहुत अच्छा काम करता है। –

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