क्या किसी दृश्य के भीतर एक चर घोषित करना संभव है? उदाहरण के लिए:
Declare @SomeVar varchar(8) = 'something'
मुझे सिंटैक्स त्रुटि देता है:
कीवर्ड 'डिक्लेयर' के पास गलत सिंटैक्स।
क्या किसी दृश्य के भीतर एक चर घोषित करना संभव है? उदाहरण के लिए:
Declare @SomeVar varchar(8) = 'something'
मुझे सिंटैक्स त्रुटि देता है:
कीवर्ड 'डिक्लेयर' के पास गलत सिंटैक्स।
जवाबों:
तुम सही हो। किसी दृश्य में स्थानीय चर की अनुमति नहीं है।
आप एक स्थानीय वैरिएबल को टेबल वैल्यू फ़ंक्शन में सेट कर सकते हैं, जो एक परिणाम सेट देता है (जैसे कोई दृश्य करता है।)
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 MyView
AS
WITH MyVars (SomeVar, Var2)
AS (
SELECT
'something' AS 'SomeVar',
123 AS 'Var2'
)
SELECT *
FROM MyTable
WHERE x = (SELECT SomeVar FROM MyVars)
संपादित करें: मैंने अपने पिछले उत्तर पर एक सीटीई का उपयोग करने की कोशिश की, जो गलत था, जैसा कि @bummi द्वारा बताया गया है। इस विकल्प के बजाय काम करना चाहिए:
इस समस्या के इर्द-गिर्द काम करने के लिए, CROSS APPLY का उपयोग करने का एक विकल्प है:
SELECT st.Value, Constants.CONSTANT_ONE, Constants.CONSTANT_TWO
FROM SomeTable st
CROSS APPLY (
SELECT 'Value1' AS CONSTANT_ONE,
'Value2' AS CONSTANT_TWO
) Constants
@datenstation की सही अवधारणा थी। चर का नाम कैश करने के लिए सीटीई का उपयोग करने वाला एक कार्य उदाहरण यहां दिया गया है:
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
के माध्यम से भी 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
स्पेंसर7593 के रूप में फ़ंक्शन का उपयोग करना गतिशील डेटा के लिए एक सही दृष्टिकोण है। स्थैतिक डेटा के लिए, एक अधिक प्रदर्शनकारी दृष्टिकोण जो एसक्यूएल डेटा डिज़ाइन (बनाम स्पार्क्स में बड़े पैमाने पर प्रक्रियात्मक कोड को लिखने के विरोधी पैटर्न) के साथ संगत है, स्थैतिक मूल्यों के साथ एक अलग तालिका बनाने और इसमें शामिल होने के लिए है। यह एक प्रॉस्पेक्ट के नजरिए से बेहद फायदेमंद है क्योंकि SQL इंजन एक JOIN के आसपास प्रभावी निष्पादन योजना बना सकता है, और आपको जरूरत पड़ने पर अनुक्रमित जोड़ने की भी क्षमता है।
फ़ंक्शन (या किसी भी इनलाइन परिकलित मान) का उपयोग करने का नुकसान कॉलआउट हर संभावित पंक्ति के लिए होता है , जो महंगा है। क्यों? क्योंकि SQL को पहले परिकलित मानों के साथ एक पूर्ण डेटासेट बनाना होता है और फिर उस डेटासेट पर WHERE क्लॉज लागू करना होता है।
दस में से नौ बार आपको अपने प्रश्नों में गतिशील रूप से गणना किए गए सेल मानों की आवश्यकता नहीं होनी चाहिए। इसका बेहतर तरीका है कि आपको क्या चाहिए, यह पता लगाने के लिए एक डेटा मॉडल तैयार करें जो इसका समर्थन करता है, और उस डेटा मॉडल को अर्ध-गतिशील डेटा (उदाहरण के लिए बैच की नौकरियों के माध्यम से) के साथ पॉप्युलेट करें और मानक SQL के माध्यम से भारी उठाने के लिए SQL इंजन का उपयोग करें ।
हां यह सही है, आपके विचारों में परिवर्तन नहीं हो सकते हैं (अन्य प्रतिबंध भी हैं)।
दृश्यों का उपयोग उन मामलों के लिए किया जा सकता है जहां परिणाम को एक चयनित कथन से बदला जा सकता है।
मैं जो करता हूं वह एक ऐसा दृश्य बनाता है जो तालिका चर के समान चयन करता है और उस दृश्य को दूसरे दृश्य में लिंक करता है। तो एक दृश्य दूसरे दृश्य से चयन कर सकता है। यह उसी परिणाम को प्राप्त करता है
आपको कितनी बार दृश्य को ताज़ा करने की आवश्यकता है? मेरे पास एक समान मामला है जहां नया डेटा महीने में एक बार आता है; फिर मुझे इसे लोड करना होगा, और लोडिंग प्रक्रियाओं के दौरान मुझे नए टेबल बनाने होंगे। उस पल में मैंने परिवर्तनों पर विचार करने के लिए अपना दृष्टिकोण बदल दिया। मैंने इस अन्य प्रश्न में आधार की जानकारी का उपयोग किया:
वहाँ, इसे 2 तरीकों से करने का प्रस्ताव है: