2015-11-26 8 views
9

में बयान मैं एक छात्र तालिका का उपयोग करते हुए समारोह निम्नलिखित मानकोंटेबल-वैल्यूड अगर एसक्यूएल सर्वर

[ID] [nvarchar](50) NOT NULL, 
[Firsname] [nvarchar](50) NOT NULL, 
[Lastname] [nvarchar](50) NOT NULL, 
[Melicode] [nchar](10) NOT NULL, 
[City] [nvarchar](50) NOT NULL, 
[Province] [nvarchar](50) NOT NULL, 
[Active] [int] NULL 

मैं एक टेबल-वैल्यूड समारोह नामित दिखाएँ जो संख्या के रूप में एक पैरामीटर है लिखना चाहते हैं के होते हैं। यदि @number = 3, केवल प्रांत रिटर्न समारोह अगर @number = 1, छात्र मेज से सभी स्तंभों

  • अगर @number = 2, केवल शहर रिटर्न छात्र
  • से लौटने

    • निम्नलिखित रूप में कार्य करेगा छात्र

    मैंने निम्नलिखित टी-एसक्यूएल लिखा, लेकिन यह केवल (अगर (@number = 1) के लिए काम करता है)। जब उपयोगकर्ता 2 या 3 के रूप में @number दर्ज करता है, तो फ़ंक्शन काम नहीं करता है। धन्यवाद

    Create function Show(@number int) 
    RETURNS @result TABLE 
    (
        [ID] [nvarchar](50) NOT NULL, 
        [Firsname] [nvarchar](50) NOT NULL, 
        [Lastname] [nvarchar](50) NOT NULL, 
        [Melicode] [nchar](10) NOT NULL, 
        [City] [nvarchar](50) NOT NULL, 
        [Province] [nvarchar](50) NOT NULL, 
        [Active] [int] NULL 
    ) 
    AS 
    BEGIN 
    
        IF (@number = 1) 
         INSERT INTO @result SELECT * from Student 
    
        IF (@number = 2) 
         INSERT INTO @result (City) values ((SELECT City from Student)) 
    
        IF (@number = 3) 
         INSERT INTO @result (Province) values ((SELECT Province from Student)) 
    
        RETURN -- @Players (variable only required for Scalar functions) 
    
    END 
    
    go 
    select *from dbo.show(1) 
    
  • +0

    से काम नहीं कर रहा है? यकीन नहीं आता। –

    उत्तर

    11

    यह नहीं काम करने जा रहा है या आपके पास मूल्यों को भरने के लिए SELECT कथन है

    INSERT INTO @result (City) 
        SELECT City 
        FROM Student 
    

    बिनाVALUES कीवर्ड: - तो आप इस वाक्य रचना की जरूरत है। और @GiorgiNakeuri सही ढंग से कहा गया है के रूप में - यह तो असफल हो जायेगी क्योंकि आपके सभी स्तंभों एक मूल्य (NOT NULL विशेषता है) की आवश्यकता होती है, तो यह डालने सफल होने नहीं कर सकते हैं - आप सभीNOT NULL मान प्रदान करने की आवश्यकता है (या प्रत्येक के लिए एक डिफ़ॉल्ट मान को परिभाषित कॉलम)

    +2

    आपने याद किया कि सभी कॉलम शून्य नहीं हैं। –

    +0

    @GiorgiNakeuri: सही - मेरी प्रतिक्रिया –

    +0

    @marc_s मैं चाहता हूं कि आईडी शून्य न हो। यह मेरे डेटाबेस में तर्क को ध्वनि देने के लिए तर्क नहीं देता है, लेकिन फ़ंक्शन उस के साथ काम नहीं करेगा। मुझे नहीं पता कि इसे कैसे ठीक किया जाए। –

    1

    मामलों 2 और 3 के लिए सम्मिलित विवरण गलत हैं। किसी चयनित कथन से आने वाले मानों को सम्मिलित करते समय VALUES कीवर्ड की आवश्यकता नहीं है। तो आप

    INSERT INTO @result (City) 
    VALUES ('New York') 
    
    INSERT INTO @result (City) 
    VALUES (@ChosenCity) 
    

    उपयोग कर सकते हैं -

    INSERT INTO @result (City) 
    VALUES ((SELECT City from Student)) 
    

    या तो आप अदिश एसक्यूएल चर, या शाब्दिक रूप में सभी मान हैं:

    +0

    मैं VALUES कीवर्ड हटा देता हूं। तो यह इस तरह बन जाता है: अगर (@number = 2) @result (शहर) में छात्र (छात्र से चयन शहर) लेकिन अभी भी काम नहीं करता है। –

    +2

    बेशक आपको (और) paranthesis की आवश्यकता नहीं है - इन्हें भी हटाया जाना चाहिए। –

    2
    CREATE FUNCTION dbo.Show 
    (
        @number INT 
    ) 
    RETURNS @result TABLE 
    (
        ID NVARCHAR(50), 
        Firsname NVARCHAR(50), 
        Lastname NVARCHAR(50), 
        Melicode NCHAR(10), 
        City NVARCHAR(50), 
        Province NVARCHAR(50), 
        Active INT 
    ) 
    AS 
    BEGIN 
    
        IF (@number = 1) 
         INSERT INTO @result 
         SELECT * FROM dbo.Student 
    
        IF (@number = 2) 
         INSERT INTO @result (City) 
         SELECT City FROM dbo.Student 
    
        IF (@number = 3) 
         INSERT INTO @result (Province) 
         SELECT Province FROM dbo.Student 
    
        RETURN 
    
    END 
    GO 
    
    SELECT * FROM dbo.Show(2) 
    
    +0

    @Giorgi Nakeuri, शायद आप यह बताना चाहते हैं कि इस जवाब में क्या गलत है? दो शब्द गायब हैं? :) – Devart

    +3

    हाँ दो शब्द गायब हैं। यह भी काम नहीं करेगा क्योंकि तालिका में सभी कॉलम शून्य नहीं हैं, और किसी ने इसे देखा नहीं है। –

    +0

    @Giorgi Nakeuri आपके लिए धन्यवाद – Devart

    2

    लौटाई गई तालिका इस बात से निर्धारित होती है कि परिणाम तालिका कैसे घोषित की गई थी। नीचे दिए गए क्वेरी (एक अर्थ में) काम करता है लेकिन परिणाम नहीं @number पैरामीटर द्वारा लक्षित उन स्तंभों के लिए NULL रों के साथ सभी कॉलम शामिल करें:

    CREATE TABLE dbo.z_Show (str1 VARCHAR(10), str2 VARCHAR(10), str3 VARCHAR(10)) 
    
    INSERT z_show 
    SELECT 1, 1, 1 UNION ALL 
    SELECT 2, 2, 2 UNION ALL 
    SELECT 3, 3, 3 
    
    CREATE FUNCTION dbo.Show(@number int) 
    RETURNS @result TABLE 
    (
        --[ID] [nvarchar](50) NOT NULL, 
        --[Firsname] [nvarchar](50) NOT NULL, 
        --[Lastname] [nvarchar](50) NOT NULL, 
        --[Melicode] [nchar](10) NOT NULL, 
        --[City] [nvarchar](50) NOT NULL, 
        --[Province] [nvarchar](50) NOT NULL, 
        --[Active] [int] NULL 
        str1 VARCHAR(10), str2 VARCHAR(10), str3 VARCHAR(10) 
    ) 
    AS 
    BEGIN 
    --for debugging|start 
    --DECLARE @number INT = 3 
    --DECLARE @result TABLE (str1 VARCHAR(10), str2 VARCHAR(10), str3 VARCHAR(10)) 
    --for debugging|end 
    
        IF (@number = 1) 
        BEGIN 
          --PRINT ('IF (@number = 1)') 
         INSERT INTO @result SELECT * from dbo.z_Show 
        END 
    
        IF (@number = 2) 
        BEGIN 
         --PRINT ('IF (@number = 2)') 
         INSERT INTO @result (str2) SELECT str2 from dbo.z_Show 
        END 
    
        IF (@number = 3) 
        BEGIN 
          --PRINT ('IF (@number = 3)') 
         INSERT INTO @result (str3) SELECT str3 from dbo.z_Show 
        END 
    
        RETURN -- @Players (variable only required for Scalar functions) 
    END 
    
    SELECT 'number 1 was passed', * 
    FROM dbo.show(1) 
    
    SELECT 'number 2 was passed', * 
    FROM dbo.show(2) 
    
    SELECT 'number 3 was passed', * 
    FROM dbo.show(3) 
    
    2

    आपने कहा @result सभी NOT NULL कॉलम शामिल हैं। यदि आप केवल @result में केवल शहर डालना चाहते हैं, तो यह शेष कॉलम Null के रूप में ले जाएगा, इसलिए एक त्रुटि हुई। आप उल्लेख नहीं करते कि @result कॉलम NOT NULL कॉलम हैं और एक और है। INSERT कथन से कीवर्ड हटाएं क्योंकि यह Select कथन

    +0

    हां, यह मदद करता है। लेकिन समस्या यह है कि परिणाम एक तालिका के साथ प्रदान किया जाता है जिसमें केवल एक कॉलम में डेटा होता है और अन्य सभी स्तंभों में शून्य मान होता है जो अच्छा नहीं दिखता है। –

    +0

    @ user3187561 क्या आप इन शून्य मानों को किसी अन्य मान के साथ बदलना चाहते हैं? –

    +0

    नहीं, मैं सिर्फ परिणाम में नल मूल्य छिपाना चाहता था। उदाहरण के लिए यदि मैं उपयोगकर्ता से @number = 2 पढ़ता हूं, तो परिणाम केवल मूल्य के साथ शहर कॉलम होना चाहिए, न कि अन्य कॉलम न्यूल के साथ। –

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