2009-03-27 16 views

उत्तर

37

वास्तव में एक मेज चर, एक में स्मृति तालिका का उपयोग कर, जाने के लिए इष्टतम तरीका है। #table temp डीबी में एक टेबल बनाता है, और ## तालिका वैश्विक है - दोनों डिस्क हिट के साथ। लेनदेन की संख्या के साथ अनुभवी धीमी गति से/हिट पर विचार करें।

CREATE PROCEDURE [dbo].[GetAccounts] 
    @AccountID BIGINT, 
    @Result INT OUT, 
    @ErrorMessage VARCHAR(255) OUT 
AS 
BEGIN 
    SET NOCOUNT ON; 
    SET @Result = 0 
    SET @ErrorMessage = '' 

    DECLARE @tmp_Accounts TABLE (
               AccountId BIGINT, 
AccountName VARCHAR(50), 
... 
) 

INSERT INTO @tmp_Accounts ([AccountId], [AccountName]... 
) 
SELECT AccountID, AccountName 
FROM Accounts 
WHERE ... 


    IF @@Rowcount = 0 
     BEGIN 
      SET @ErrorMessage = 'No accounts found.' 
      SET @Result = 0 

      RETURN @Result 
     END 
    ELSE 
     BEGIN 
      SET @Result = 1 

      SELECT * 
      FROM @tmp_Accounts 
     END 

इस temp तालिका में डालने के तरीके पर ध्यान दें।

इसका निचला पक्ष यह है कि लिखने में थोड़ा समय लग सकता है, क्योंकि आपको अपनी तालिका चर परिभाषित करना है।

मैं रेडगेट द्वारा क्वेरी विश्लेषक के लिए एसक्यूएल प्रॉम्प्ट की भी सिफारिश करता हूं।

+1

का उपयोग करते हैं तो अपनी प्रक्रिया के अंत में 'ड्रॉप तालिका # Temp1' करना न भूलें, हालांकि, तालिका चर को संकलित करने के लिए परिभाषित किया जाना चाहिए रन टाइम सही से? इसके लिए मुझे गतिशील रूप से जेनरेट की गई तालिका की आवश्यकता थी। – Jeff

+0

टेबल वैरिएबल को स्पोक में परिभाषित किया गया है, जिसे मैं नीचे पोस्ट करूंगा ... – ElHaix

+1

उह, लेकिन यह इतना वर्बोज़ है, खासकर जब से टीएसक्यूएल में "सम्मिलित या अद्यतन" कथन नहीं है ... –

10

हाँ, आप इसे

SELECT INTO ... 

साथ बना सकते हैं मान लीजिए कि

SELECT * INTO #t 
FROM OPENQUERY('server', 
'exec database.dbo.proc_name value1, value2, ... ') 
+0

ओह यही उसका मतलब था !! –

+0

क्या यह तालिका चर के साथ काम करता है? – recursive

+0

मुझे नहीं पता, क्षमा करें। – boj

28

आप OPENQUERY की जरूरत नहीं है करते हैं। बस का चयन सूची और किसी भी प्रश्न का से के बीच "में #AnyTableName" डाल ...

SELECT * 
    INTO #Temp1 
    FROM table1 
    WHERE x=y 
+0

या तालिका 1 से # टेम्पप 1 में चुनें * 0 = 1 – GernBlandston

+4

यदि आप इस विधि – Matthieu