क्या एक दृश्य के भीतर एक चर घोषित करना संभव है? उदाहरण के लिए:एसक्यूएल दृश्य - कोई चर नहीं?
Declare @SomeVar varchar(8) = 'something'
मुझे सिंटेक्स त्रुटि देता है:
Incorrect syntax near the keyword 'Declare'.
क्या एक दृश्य के भीतर एक चर घोषित करना संभव है? उदाहरण के लिए:एसक्यूएल दृश्य - कोई चर नहीं?
Declare @SomeVar varchar(8) = 'something'
मुझे सिंटेक्स त्रुटि देता है:
Incorrect syntax near the keyword 'Declare'.
आप सही हैं। दृश्य में स्थानीय चर की अनुमति नहीं है।
आप एक मेज महत्वपूर्ण समारोह में एक स्थानीय चर है, जो एक परिणाम सेट रिटर्न सेट कर सकते हैं (एक दृश्य की तरह।)
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
हाँ यह सही है, तो आप उसे देखे में चर नहीं हो सकता है (वहाँ अन्य प्रतिबंध भी कर रहे हैं)।
विचार उन मामलों के लिए उपयोग किया जा सकता है जहां परिणाम को एक चयनित कथन के साथ बदला जा सकता है।
एक तालिका समारोह एक का चयन करें बयान में बदला जा सकता है और
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
@ जेफो - सुनिश्चित नहीं है कि आप क्या इंगित करते हैं। – Hogan
क्या आप कह रहे हैं कि एक चयनित कथन में स्थानीय चर नहीं हो सकते हैं, एक दृश्य या तो नहीं हो सकता है? – JeffO
संपादित करें: मैं, मेरे पिछले जवाब जो गलत था पर एक 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
सुधार के लिए धन्यवाद - इसके बजाय क्रॉस आवेदन का उपयोग करने के लिए अपडेट किया गया है। –
यह काम करता है, लेकिन क्रॉस के कॉलम लागू नहीं करते हैं प्रत्येक पंक्ति के लिए पुन: प्रारंभ करें? विशेष रूप से गणना मूल्यों के लिए जो एक बड़ा प्रदर्शन नुकसान का मतलब होगा। यह सिर्फ दुखद है कि स्थानीय चरणीय और सीटीई एक दृश्य में उपलब्ध नहीं हैं, किसी को भी एक विचार क्यों? –
मैं क्या एक राय यह है कि तालिका चर के रूप में और एक ही चयन कैसा प्रदर्शन करता है है:
यहाँ इस समस्या को हल करने के लिए जिस तरह का काम, लागू एक क्रॉस का उपयोग कर एक ही विकल्प है लिंक जो दूसरे दृश्य में देखते हैं। तो एक दृश्य दूसरे दृश्य से चयन कर सकते हैं। यह एक ही परिणाम प्राप्त करता है
बेन, यह तब तक एक प्रदर्शन समस्या का कारण बन जाएगा जब तक कि आप बहुत छोटी टेबल से निपट नहीं रहे हैं। – logixologist
स्पेंसर 75 9 3 के रूप में वर्णों का उपयोग करना गतिशील डेटा के लिए एक सही दृष्टिकोण है। स्थिर डेटा के लिए, एक अधिक प्रदर्शन दृष्टिकोण जो SQL डेटा डिज़ाइन के साथ संगत है (बनाम स्प्रेक्स में बड़े पैमाने पर प्रक्रियात्मक कोड लिखने के विरोधी पैटर्न) स्थिर मूल्यों के साथ एक अलग तालिका बनाना और इसमें शामिल होना है। यह एक प्रदर्शन परिप्रेक्ष्य से बेहद फायदेमंद है क्योंकि एसक्यूएल इंजन जॉइन के आसपास प्रभावी निष्पादन योजनाएं बना सकता है, और यदि आवश्यक हो तो आपके पास इंडेक्स भी जोड़ने की क्षमता है।
फ़ंक्शंस (या किसी भी इनलाइन गणना मान) का उपयोग करने का नुकसान प्रत्येक संभावित पंक्ति के लिए कॉलआउट होता है, जो महंगा है। क्यूं कर? चूंकि एसक्यूएल को पहले गणना किए गए मानों के साथ एक पूर्ण डेटासेट बनाना है और फिर उस डेटासेट में WHERE क्लॉज लागू करना है।
दस में से नौ बार आपको अपने प्रश्नों में गतिशील रूप से गणना की गई सेल मानों की आवश्यकता नहीं होनी चाहिए। यह जानने के लिए यह बहुत बेहतर है कि आपको क्या चाहिए, फिर उस डेटा मॉडल को डिज़ाइन करें जो इसका समर्थन करता है, और उस डेटा मॉडल को अर्ध-गतिशील डेटा (उदाहरण के लिए बैच नौकरियों के माध्यम से) के साथ पॉप्युलेट करें और भारी उठाने के लिए SQL इंजन का उपयोग करें मानक एसक्यूएल।
आप अपनी अभिव्यक्तियों को परिभाषित करने के लिए उपयोग कर सकते हैं। फिर उन परिभाषाओं तक पहुंचने के लिए एक सरल उप-चयन करें।
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)
@ डेटेनस्टेशन में सही अवधारणा थी।के माध्यम से 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
वे चीजों को इस भयानक कैसे बना सकते हैं? कभी-कभी मुझे लगता है कि वे केवल माइक्रोसॉफ्ट प्रमाणित पेशेवरों को किराए पर लेते हैं। –
मुझे लगता है कि एक ऐसा कोर्स है जो आपके बाहर उपयोगकर्ता की अवधारणा को धड़कता है और उस प्रमाणीकरण के लिए आपको प्रीपेस करने वाले पैसे के बैग की अवधारणा के साथ बदल देता है – user1566694