2009-09-18 7 views
12
CREATE PROCEDURE [test].[proc] 
@ConfiguredContentId int, 
@NumberOfGames int 
AS 
BEGIN 
SET NOCOUNT ON 
RETURN 
@WunNumbers TABLE (WinNumb int) 

    INSERT INTO @WunNumbers (WinNumb) 
SELECT TOP (@NumberOfGames) WinningNumber 
FROM [Game].[Game] g 
JOIN [Game].[RouletteResult] AS rr ON g.[Id] = rr.[gameId] 
WHERE g.[ConfiguredContentId] = @ConfiguredContentId 
ORDER BY g.[Stoptime] DESC 

SELECT WinNumb, COUNT (WinNumb) AS "Count" 
FROM @WunNumbers wn 
GROUP BY wn.[WinNumb] 
END 
GO 

यह संग्रहित प्रक्रिया पहले चयन कथन से मूल्य लौटाती है, लेकिन मैं लौटने के लिए दूसरे चयन कथन से मूल्य प्राप्त करना चाहता हूं। टेबल @WunNumbers एक अस्थायी तालिका है।संग्रहित प्रक्रिया से अस्थायी तालिका को वापस कैसे करें

कोई विचार ???

+0

कृपया अपने एसक्यूएल कोड को दोबारा सुधारें। –

+0

वह कोड मान्य एसक्यूएल नहीं है। ऐसा हो सकता है, अगर "रिटर्न @ विननबर्स" "डेक्लेयर @ विननबर्स" था, लेकिन फिर बाकी के अंतिम परिणाम सेट –

+0

को वापस करने का अधिकार दिखता है, अब मैं देखता हूं, मैंने गलत कोड पोस्ट किया है। "DECLARE @WinNumbers" है लेकिन यह अभी भी काम नहीं करता है। – dani

उत्तर

6

SQL सर्वर का कौन सा संस्करण आप उपयोग कर रहे हैं? SQL सर्वर 2008 में आप Table Parameters and Table Types का उपयोग कर सकते हैं।

एक वैकल्पिक दृष्टिकोण उपयोगकर्ता परिभाषित फ़ंक्शन से तालिका चर वापस करने के लिए है, लेकिन मैं इस विधि का एक बड़ा प्रशंसक नहीं हूं।

आप एक उदाहरण here

+0

मैं एसक्यूएल सर्वर 2005 – dani

25

पा सकते हैं इस कोड पर एक नजर डालें,

CREATE PROCEDURE Test 

AS 
    DECLARE @tab table (no int, name varchar(30)) 

    insert @tab select eno,ename from emp 

    select * from @tab 
RETURN 
+0

का उपयोग कर रहा हूं यह कॉलर को टेबल वैरिएबल को वापस/आउटपुट कैसे करेगा? यह वर्तमान में एक परिणाम सेट देता है। –

+3

यह चयनित कथन (वास्तविक प्रश्न) का परिणाम देता है जो इस मामले में, स्थानीय तालिका चर @tab की सामग्री होती है। – JeffO

+5

अगर मैं 'एक्स्ट्यूक्ट टेस्ट' करता हूं तो मुझे @tab तक कैसे पहुंच मिलती है? – whytheq

0

एक प्रक्रिया की वापसी प्रकार int है।

तुम भी परिणाम सेट वापस कर सकते हैं (के रूप में अपने कोड वर्तमान में करता है) (ठीक है, तुम भी संदेश, जो तार कर रहे हैं भेज सकते हैं)

उन ही कर रहे हैं "रिटर्न" आप कर सकते हैं। जबकि आप किसी प्रक्रिया में तालिका-मूल्यवान पैरामीटर जोड़ सकते हैं (बीओएल देखें), वे केवल इनपुट हैं।

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

(या के रूप में एक और पोस्टर उल्लेख किया है, तो आप भी एक टेबल मूल्य समारोह, बजाय एक प्रक्रिया इस्तेमाल कर सकते हैं)

2

एक अस्थायी तालिका कॉलर में बनाया जा सकता है और फिर से बसा एसपी कहा जाता है।

create table #GetValuesOutputTable(
    ... 
); 

    exec GetValues; -- populates #GetValuesOutputTable 

    select * from #GetValuesOutputTable; 

"डालने कार्यकारी" पर इस दृष्टिकोण के कुछ लाभ है कि यह नेस्ट किया जा सकता है और यह इनपुट या आउटपुट के रूप में इस्तेमाल किया जा सकता है।

कुछ नुकसान यह है कि "तर्क" सार्वजनिक नहीं है, तालिका कॉलर प्रत्येक कॉलर के भीतर मौजूद है, और तालिका का नाम अन्य अस्थायी वस्तुओं के साथ टकरा सकता है। इससे मदद मिलती है जब अस्थायी तालिका का नाम एसपी नाम से निकटता से मेल खाता है और कुछ सम्मेलन का पालन करता है।

इसे थोड़ी दूर ले जाना, आउटपुट केवल अस्थायी तालिकाओं के लिए, सम्मिलित-निष्पादन दृष्टिकोण और अस्थायी तालिका दृष्टिकोण को एसपी द्वारा एक साथ समर्थित किया जा सकता है। यह एसपी को चेन करने के लिए बहुत मदद नहीं करता है क्योंकि तालिका को अभी भी कॉलर में परिभाषित करने की आवश्यकता है, लेकिन सीएमडी लाइन से परीक्षण को सरल बनाने में या बाहरी रूप से कॉल करने में मदद कर सकता है।

-- The "called" SP 
    declare 
     @returnAsSelect bit = 0; 

    if object_id('tempdb..#GetValuesOutputTable') is null 
    begin 
     set @returnAsSelect = 1; 
     create table #GetValuesOutputTable(
     ... 
    ); 
    end 

    -- populate the table 

    if @returnAsSelect = 1 
     select * from #GetValuesOutputTable; 
0

हाँ तुम कर सकते।

आपकी संग्रहीत प्रक्रिया में, आप तालिका @tbRetour भरें।

अपने संग्रहीत प्रक्रिया के बहुत अंत में, आप लिखें:

SELECT * FROM @tbRetour 

संग्रहीत प्रक्रिया निष्पादित करने के लिए, आप लिखते हैं:

USE [...] 
GO 

DECLARE @return_value int 

EXEC @return_value = [dbo].[getEnregistrementWithDetails] 
@id_enregistrement_entete = '(guid)' 

GO 
0

पहले एक टेम्पलेट के रूप में एक वास्तविक, स्थायी तालिका बनाने कि एक नामकरण सम्मेलन का उपयोग करके लौटाए गए अस्थायी तालिका के लिए आवश्यक लेआउट है जो इसे टेम्पलेट के रूप में पहचानता है और इसे एसपी के लिए प्रतीकात्मक रूप से लिंक करता है, उदाहरण के लिए tmp_SPName_Output। इस तालिका में कभी भी कोई डेटा नहीं होगा।

एसपी में, उसी नामकरण सम्मेलन के बाद डेटा को एक टेम्प तालिका में लोड करने के लिए INSERT का उपयोग करें, उदा। #SPName_Output जो अस्तित्व में है माना जाता है। आप इसके अस्तित्व के लिए परीक्षण कर सकते हैं और अगर ऐसा नहीं होता है तो एक त्रुटि लौटा सकते हैं।

SELECT TOP(0) * INTO #SPName_Output FROM tmp_SPName_Output; 
EXEC SPName; 
-- Now process records in #SPName_Output; 

यह इन अलग फायदे हैं:

एसपी उपयोग अस्थायी तालिका बनाने के लिए इस सरल चयन कॉल करने से पहले

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