2011-05-24 12 views

उत्तर

43

आप सही हैं। दृश्य में स्थानीय चर की अनुमति नहीं है।

आप एक मेज महत्वपूर्ण समारोह में एक स्थानीय चर है, जो एक परिणाम सेट रिटर्न सेट कर सकते हैं (एक दृश्य की तरह।)

http://msdn.microsoft.com/en-us/library/ms191165.aspx

उदा

CREATE FUNCTION dbo.udf_foo() 
RETURNS @ret TABLE (col INT) 
AS 
BEGIN 
    DECLARE @myvar INT; 
    SELECT @myvar = 1; 
    INSERT INTO @ret SELECT @myvar; 
    RETURN; 
END; 
GO 
SELECT * FROM dbo.udf_foo(); 
GO 
+4

वे चीजों को इस भयानक कैसे बना सकते हैं? कभी-कभी मुझे लगता है कि वे केवल माइक्रोसॉफ्ट प्रमाणित पेशेवरों को किराए पर लेते हैं। –

+1

मुझे लगता है कि एक ऐसा कोर्स है जो आपके बाहर उपयोगकर्ता की अवधारणा को धड़कता है और उस प्रमाणीकरण के लिए आपको प्रीपेस करने वाले पैसे के बैग की अवधारणा के साथ बदल देता है – user1566694

3

हाँ यह सही है, तो आप उसे देखे में चर नहीं हो सकता है (वहाँ अन्य प्रतिबंध भी कर रहे हैं)।

विचार उन मामलों के लिए उपयोग किया जा सकता है जहां परिणाम को एक चयनित कथन के साथ बदला जा सकता है।

+0

एक तालिका समारोह एक का चयन करें बयान में बदला जा सकता है और

CREATE VIEW vwImportant_Users AS WITH params AS ( SELECT varType='%Admin%', varMinStatus=1) SELECT status, name FROM sys.sysusers, params WHERE status > varMinStatus OR name LIKE varType SELECT * FROM vwImportant_Users 
भी

के माध्यम से JOIN

WITH params AS (SELECT varType='%Admin%', varMinStatus=1) SELECT status, name FROM sys.sysusers INNER JOIN params ON 1=1 WHERE status > varMinStatus OR name LIKE varType 

भी: यहाँ एक काम उदाहरण चर के नाम को कैश करने के CTE का उपयोग करता है इसमें स्थानीय चर हैं। – JeffO

+0

@ जेफो - सुनिश्चित नहीं है कि आप क्या इंगित करते हैं। – Hogan

+0

क्या आप कह रहे हैं कि एक चयनित कथन में स्थानीय चर नहीं हो सकते हैं, एक दृश्य या तो नहीं हो सकता है? – JeffO

13

संपादित करें: मैं, मेरे पिछले जवाब जो गलत था पर एक CTE का उपयोग कर के रूप में @bummi द्वारा बताया की कोशिश की। यह विकल्प के बजाय काम करना चाहिए:

SELECT st.Value, Constants.CONSTANT_ONE, Constants.CONSTANT_TWO 
FROM SomeTable st 
CROSS APPLY (
    SELECT 'Value1' AS CONSTANT_ONE, 
      'Value2' AS CONSTANT_TWO 
) Constants 
+0

सुधार के लिए धन्यवाद - इसके बजाय क्रॉस आवेदन का उपयोग करने के लिए अपडेट किया गया है। –

+0

यह काम करता है, लेकिन क्रॉस के कॉलम लागू नहीं करते हैं प्रत्येक पंक्ति के लिए पुन: प्रारंभ करें? विशेष रूप से गणना मूल्यों के लिए जो एक बड़ा प्रदर्शन नुकसान का मतलब होगा। यह सिर्फ दुखद है कि स्थानीय चरणीय और सीटीई एक दृश्य में उपलब्ध नहीं हैं, किसी को भी एक विचार क्यों? –

1

मैं क्या एक राय यह है कि तालिका चर के रूप में और एक ही चयन कैसा प्रदर्शन करता है है:

यहाँ इस समस्या को हल करने के लिए जिस तरह का काम, लागू एक क्रॉस का उपयोग कर एक ही विकल्प है लिंक जो दूसरे दृश्य में देखते हैं। तो एक दृश्य दूसरे दृश्य से चयन कर सकते हैं। यह एक ही परिणाम प्राप्त करता है

+1

बेन, यह तब तक एक प्रदर्शन समस्या का कारण बन जाएगा जब तक कि आप बहुत छोटी टेबल से निपट नहीं रहे हैं। – logixologist

0

स्पेंसर 75 9 3 के रूप में वर्णों का उपयोग करना गतिशील डेटा के लिए एक सही दृष्टिकोण है। स्थिर डेटा के लिए, एक अधिक प्रदर्शन दृष्टिकोण जो SQL डेटा डिज़ाइन के साथ संगत है (बनाम स्प्रेक्स में बड़े पैमाने पर प्रक्रियात्मक कोड लिखने के विरोधी पैटर्न) स्थिर मूल्यों के साथ एक अलग तालिका बनाना और इसमें शामिल होना है। यह एक प्रदर्शन परिप्रेक्ष्य से बेहद फायदेमंद है क्योंकि एसक्यूएल इंजन जॉइन के आसपास प्रभावी निष्पादन योजनाएं बना सकता है, और यदि आवश्यक हो तो आपके पास इंडेक्स भी जोड़ने की क्षमता है।

फ़ंक्शंस (या किसी भी इनलाइन गणना मान) का उपयोग करने का नुकसान प्रत्येक संभावित पंक्ति के लिए कॉलआउट होता है, जो महंगा है। क्यूं कर? चूंकि एसक्यूएल को पहले गणना किए गए मानों के साथ एक पूर्ण डेटासेट बनाना है और फिर उस डेटासेट में WHERE क्लॉज लागू करना है।

दस में से नौ बार आपको अपने प्रश्नों में गतिशील रूप से गणना की गई सेल मानों की आवश्यकता नहीं होनी चाहिए। यह जानने के लिए यह बहुत बेहतर है कि आपको क्या चाहिए, फिर उस डेटा मॉडल को डिज़ाइन करें जो इसका समर्थन करता है, और उस डेटा मॉडल को अर्ध-गतिशील डेटा (उदाहरण के लिए बैच नौकरियों के माध्यम से) के साथ पॉप्युलेट करें और भारी उठाने के लिए SQL इंजन का उपयोग करें मानक एसक्यूएल।

15

आप अपनी अभिव्यक्तियों को परिभाषित करने के लिए उपयोग कर सकते हैं। फिर उन परिभाषाओं तक पहुंचने के लिए एक सरल उप-चयन करें।

CREATE VIEW MyView 
AS 
    WITH MyVars (SomeVar, Var2) 
    AS (
    SELECT 
     'something' AS 'SomeVar', 
     123 AS 'Var2' 
) 

    SELECT * 
    FROM MyTable 
    WHERE x = (SELECT SomeVar FROM MyVars) 
0

@ डेटेनस्टेशन में सही अवधारणा थी।के माध्यम से CROSS APPLY

WITH params AS (SELECT varType='%Admin%', varMinStatus=1) 
SELECT status, name 
    FROM sys.sysusers CROSS APPLY params 
    WHERE status > varMinStatus OR name LIKE varType 
संबंधित मुद्दे