2009-06-11 8 views
22

आज क्लाइंट के उत्पादन प्रणाली के अंदर, मुझे एक SQL सर्वर क्वेरी मिली जिसमें एक अपरिचित वाक्यविन्यास था। नीचे दिए गए उदाहरण में, *= ऑपरेटर क्या करता है? मुझे इसका कोई उल्लेख नहीं मिला on MSDN। क्वेरी निष्पादित और डेटा वापस करता है। जहां तक ​​किसी को भी जानता है के रूप में, इस प्रणाली में कर दिया गया है क्योंकि वे SQL Server 2000 उपयोग कर रहे थे, लेकिन वे अब 2005.एसक्यूएल सर्वर * = ऑपरेटर?

declare @nProduct int 
declare @iPricingType int 
declare @nMCC int 

set @nProduct = 4 
set @iPricingType = 2 
set @nMCC = 230 

--Build SQL for factor matrix 

Select distinct 
base.uiBase_Price_ID, 
base.nNoteRate, 
base.sDeliveryOpt, 
IsNull(base.nPrice,0) as nPrice, 
IsNull(base.nPrice,0) + Isnull(fact.nFactor,0) as nAdjPrice, 
base.iProduct_ID, 
fact.iPosition as fiPosition, 
base.iPosition, 
CONVERT(varchar(20), base.dtDate_Updated, 101) + ' ' + CONVERT(varchar(20), base.dtDate_Updated, 108) as 'dtDate_Updated', 
fact.nFactor, 
fact.nTreasFactor, 
product.sProduct_txt , 
pfi.sPFI_Name, 
mccprod.nServicing_Fee, 
fact.nNoteRate as fNoteRate, 
mcc.nLRA_Charge as nLRA 
From 
tbl_Base_Prices base, tbl_Factors fact, tbl_Product product, tbl_PFI pfi, tbl_MCC mcc, tbl_MCC_Product mccprod 
Where 
base.iProduct_ID = @nProduct 
And base.iProduct_ID *= fact.iProduct_ID 
And base.iPosition *= fact.iPosition 
And base.nNoteRate *= fact.nNoteRate 
And base.iPricing_Type = @iPricingType 
And fact.iMCC_ID = @nMCC 
And fact.iProduct_ID = @nProduct 
And mcc.iMCC_ID = @nMCC 
And mcc.iPFI_ID = pfi.iPFI_ID 
And mccprod.iMCC_ID = @nMCC 
And mccprod.iProduct_ID = @nProduct 
And base.iProduct_ID = product.iProduct_ID 
and fact.iPricing_Type= @iPricingType 
Order By 
base.nNoteRate, base.iPosition 

उत्तर

24

इस कोड को तुरंत हटाएं और बाएं जुड़ें के साथ प्रतिस्थापित करें। यह कोड हमेशा SQL Server 2000 में सही ढंग से व्याख्या नहीं करता है (कभी-कभी SQL सर्वर निर्णय लेता है कि यह एक क्रॉस जॉइन है) और इस प्रकार गलत परिणाम दे सकते हैं! इसके अलावा भविष्य के लिए इसे बहिष्कृत किया गया है।

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

+3

'यह कोड हमेशा SQL Server 2000 में सही ढंग से व्याख्या नहीं करता है (कभी-कभी SQL सर्वर निर्णय लेता है) यह भी गलत परिणाम दे सकता है! इसके अलावा भविष्य के लिए इसे बहिष्कृत किया गया है। 'मुझे पता है कि यह बहुत पुराना है, लेकिन मैं सोच रहा था कि क्या आपके पास दस्तावेज था जो इस कथन का समर्थन करता है? धन्यवाद! – swasheck

+2

* एसक्यूएल-9 2 सिंटैक्स की सिफारिश की जाती है क्योंकि यह अस्पष्टता के अधीन नहीं है जो कभी-कभी विरासत ट्रांजैक्ट-एसक्यूएल बाहरी जुड़ती है। * [एसक्यूएल 2000 बीओएल: बाहरी जोड़ों का उपयोग] से [http://msdn.microsoft.com /en-us/library/aa213228(v=sql.80).aspx)। उस विषय के नए संस्करणों में '* =' और '= *' शामिल नहीं है। –

+1

इसके अलावा (धन्यवाद @MikaelEriksson): * बाहरी जोड़ों के लिए इस वाक्यविन्यास का उपयोग अस्पष्ट व्याख्या की संभावना के कारण निराश है और क्योंकि यह गैर मानक है। इसके बजाय, FROM खंड में शामिल हों निर्दिष्ट करें। * [SQL 2000 BOL: SELECT] से (http://msdn.microsoft.com/en-us/library/aa259187 (v ​​= sql.80) .aspx)। –

5

चल रहे हैं यह एक आशुलिपि वाक्य रचना में शामिल होने के लिए है। इस धागे को देखें जो इस विषय को कवर करता है।

Transact-SQL shorthand join syntax?

0

बड़े एएनएसआई (एएनएसआई-89) वाक्य रचना बाहरी छोड़ दिया है कि ऑपरेटर शामिल हो। मैं इसका उपयोग न करने की अनुशंसा करता हूं - एएनएसआई सिंटैक्स अधिक वर्बोज़ है और यह अधिक पढ़ने योग्य है।

+1

यह गैर मानक और वंचित है इसलिए एएनएसआई नहीं;) –

+0

वे ansi-89 हैं, न कि नई ansi-92 –

1

मेरा मानना ​​है कि वे "गैर-एएनएसआई बाहरी जॉइन ऑपरेटर" हैं। आपका डेटाबेस संगतता स्तर 80 या उससे कम होना चाहिए।

+1

ansi-92 के बजाय ansi, सिर्फ ansi-89 हैं। वे भी EVIL हैं। –

10

यह एक बायां बाहरी शामिल है, = * सही बाहरी शामिल है।

उदा। निम्नलिखित बराबर हैं;

SELECT * FROM Table1 LEFT OUTER JOIN Table2 ON Table1.ID = Table2.FK_ID 

    SELECT * FROM Table1, Table2 WHERE Table1.ID *= Table2.FK_ID 
+0

असल में, वे हमेशा बराबर नहीं होते हैं। इस तरह की एक साधारण क्वेरी में, शायद एक और जटिल क्वेरी में, एक अच्छा chacne taht डेटाबेस एक बाएं शामिल होने के बजाय एक क्रॉस जॉइन के रूप में व्याख्या करेगा। यहां तक ​​कि SQL Server 2000 बीओएल इस मुद्दे के बारे में भी बात करता है। ऐसी कोई परिस्थिति नहीं है जहां SQL सर्वर में अंतर्निहित बाएं शामिल वाक्यविन्यास का उपयोग करना उचित नहीं है जब तक कि आप ऐसे प्रारंभिक संस्करण का उपयोग नहीं कर रहे हैं जो वाक्यविन्यास का समर्थन नहीं करता है। – HLGEM

6

बाह्य जुड़ने के लिए गैर-एएनएसआई वाक्यविन्यास (*= और =*) आधिकारिक list of deprecated features that will be removed in the next version of SQL पर है।

निम्नलिखित एसक्यूएल सर्वर डाटाबेस इंजन सुविधाओं एसक्यूएल सर्वर के अगले संस्करण में समर्थित नहीं किया जाएगा। इन सुविधाओं का उपयोग नए विकास कार्य में नहीं करते हैं, और अनुप्रयोगों को संशोधित करते हैं जो वर्तमान में इन सुविधाओं को जितनी जल्दी हो सके उपयोग करते हैं।

प्रतिस्थापन सुविधा ANSI compliant syntax of JOIN है।

+0

@ spencer7593 मुझे लगता है कि आप गलत हैं। '* =' और '= *' स्वामित्व वाक्यविन्यास था, कभी भी किसी भी एएनएसआई/आईएसओ मानक में नहीं। –

संबंधित मुद्दे